2010-04-07 104 views
22

我怎麼能告訴例如Tomcat在給定我的WAR-File時使用特定的上下文路徑?定義Servlet上下文

例子: 我有Maven構建創建一個war文件,並將所得的文件的名稱是相當長的。 所以我不希望tomcat管理器應用程序使用戰爭的文件名作爲上下文。

供應在META-INF一個context.xml中並沒有產生預期的效果

我也發現了這個文檔中的path屬性Context

該字段的值不能除非靜態定義server.xml中的Context,否則將被設置,因爲它將從用於.xml上下文文件或docBase的文件名中推斷出來。

所以它似乎並沒有正確的方式告訴應用程序服務器我的WAR的路徑應該是什麼。

任何更多的提示?

回答

28

有該Context Container的文檔中的兩個要點:在$CATALINA_BASE/conf/[enginename]/[hostname]/目錄

  • 在單個文件(帶有名爲 「.xml」 擴展名)。 文件(以下.xml擴展)的名稱將被用作上下文路徑。多級上下文路徑可以使用例如#來定義。 foo#bar.xml作爲/ foo/bar的上下文路徑。默認的Web應用程序可以使用名爲ROOT.xml的文件來定義。
  • 只有一個上下文文件不應用在$CATALINA_BASE/conf/[enginename]/[hostname]//META-INF/context.xml申請文件中存在,在一個單獨的文件。 如果Web應用程序被打包爲一個WAR然後/META-INF/context.xml將被複制到$CATALINA_BASE/conf/[enginename]/[hostname]/並更名爲符合應用的上下文路徑。一旦這個文件存在,如果在主機的appBase中放置了一個新的更新的/META-INF/context.xml的WAR,它將不會被替換。

所以,當你捆綁META-INF/context.xml,該文件被重命名爲WAR的名稱,該名稱將成爲上下文路徑,而不管Context元素定義的任何path的。

我看到這樣兩個選項:

  1. 即可以將生成的戰爭較短的名稱的名稱(我建議使用<finalName><warName>它被廢棄據我所知):

    <project> 
        ... 
        <build> 
        <finalName>mycontext</finalName> 
        ... 
        </build> 
        ... 
    </project> 
    
  2. 或者使用maven-tomcat-plugin的部署和設置上下文路徑的插件配置:

    <project> 
        ... 
        <build> 
        ... 
        <plugins> 
         ... 
         <plugin> 
         <groupId>org.codehaus.mojo</groupId> 
         <artifactId>tomcat-maven-plugin</artifactId> 
         <version>1.0-SNAPSHOT</version> 
         <configuration> 
          <path>/mycontext</path> 
         </configuration> 
         </plugin> 
         ... 
        </plugins> 
        ... 
        </build> 
        ... 
    </project> 
    
+1

感謝您的代碼段。下面的句子對我的東西很重要。添加到context.xml文件本身的註釋/引用是下一個開發人員的警告。 「一旦該文件存在,它不會,如果有新的/META-INF/context.xml一個新的WAR被放置在主機的appBase所取代。」 – argatxa 2010-08-18 12:20:02

4

您可以設置META-INF/context.xml<Context>元素的path屬性。

或者,你可以配置Maven來使用自定義名稱創建戰爭神器:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <warName>yourCustomWarName</warName> 
      </configuration> 
     </plugin> 
     ........ 
    </plugins> 
</build> 
+4

對不起,這裏一個破紀錄,但設置的路徑實際上並沒有在Tomcat中(在6.0.28測試)工作,由帕斯卡爾如上所述。 – John 2011-03-24 10:23:26

+1

我downvote的第一句,因爲它根本就不是真實的,上下文路徑來自WAR文件名,但答案的其餘部分是好的 – chrisbunney 2011-09-29 11:49:51

+0

@chrisbunney上下文路徑來自默認的WAR文件名,但可以被推翻 – Bozho 2011-09-29 11:52:04

2

在你的項目中有一個文件夾META-INF,該文件夾中有一個context.xml文件。

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/myproject" /> 
+0

我想用這個approche,但是當Tomcat解壓我的戰爭,它創建了一個文件夾與war相同的名稱,再加上它在/opt/apache-tomcat-6.0.29/conf/Catalina/localhost/中創建一個.xml文件,這是你提到的定義的context.xml的副本。你明白爲什麼嗎? – benzen 2010-11-11 15:24:53

+0

我同意 - 由於Pascal – John 2011-03-24 10:20:18

+0

@John描述的原因,這種方法在Tomcat 6.0.28中肯定不起作用@John當我編譯一場戰爭時,它確實對我有用。 – Mark 2011-03-24 12:38:44

5

我發現一個簡單的解決方案,以保持戰爭文件名,並選擇上下文路徑。

您只需在主機的appBase之外部署您的戰爭並在appBase目錄內創建鏈接。

Ex。 :

ln -sf ${CATALINA_HOME}/wars/myapp-0.0.8-SNAPSHOT.war ${CATALINA_HOME}/webapps/myapp.war 

埃克爾

+0

符號鏈接通過簡單地更改符號鏈接來提供快速回滾的附加好處。 – 2014-05-14 04:20:47

+1

此解決方案還有助於自動化http://java.dzone.com/articles/super-quick-tomcat-app – 2015-02-06 15:30:33