2017-03-16 68 views
0

如何配置Tomcat 7以允許WAR文件指定其自己的上下文根,該上下文根不基於WAR文件名?例如:我有A-1.0.0.war和B-1.0.0.war,我想將它們都部署到同一個Tomcat實例中。當部署完成時,我想將瀏覽器指向localhost:8080/portal並查看A-1.0.0.war中的內容,並且我想將一個休息請求curl到localhost:8080/rest/v1/helloworld,其實現來自B-1.0.0.war。Tomcat中WAR文件中的上下文根配置7

我已經四處搜尋,並嘗試配置不同的方式,但這些都沒有產生我上面的期望的情況。另外,我發現Tomcat文檔有點太稀少,無法完全理解。我讀過:

  1. Tomcat 7 html manager howto
  2. Tomcat host config
  3. deploying-war-file-to-tomcat-with-a-different-path

消化的,在%CATALINA_HOME%/ conf目錄後/ server.xml中我有這臺主機條目:

<Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true" 
      deployXML="true" copyXML="true" > 
    <Context path="/portal" docBase="/www/" reloadable="true" swallowOutput="true"> 
     <WatchedResource>WEB-INF/web.xml</WatchedResource> 
     <Logger className="org.apache.catalina.logger.FileLogger" prefix="www-sample-com-log." suffix=".txt" timestamp="true"/> 
    </Context> 
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
      prefix="localhost_access_log" suffix=".txt" 
      pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
</Host> 

這是A.war/META-INF/context.xml從t中的一個完整內容他WAR文件:

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/portal" docBase="ROOT/portal" /> 

當我通過管理控制檯部署到Tomcat,我現在用的是「WAR文件部署」按鈕,但我沒有「部署的目錄或WAR文件在指定的任何字段位於服務器上「(因爲我希望這些來自WAR本身,而不是讓某人指定它)。當我打開webapps目錄時,我看到這個列表。我希望看到的,而不是A-1.0.0/目錄,portal/

A-1.0.0/ 
B-1.0.0/ 
docs/ 
examples/ 
host-manager/ 
manager/ 
ROOT/ 
sample/ 
A-1.0.0.war 
B-1.0.0.war 
sample.war 

萬一有幫助,這裏的一些背景故事,以我的方案。我的目標是將捆綁在一個.jar中的應用程序移動到兩個.war文件中。目前,這是一個maven項目,它生成一個jar作爲其包含Spring MVC和JSP應用程序的構建工件。我的客戶正在使用java在命令行上啓動應用程序。我想要在我們的開發服務器上安裝Tomcat 7,通過Tomcat的管理控制檯可以部署WAR文件。我還想在WAR的文件名中加上一個版本號,以便處理WAR的人員清楚他們正在部署的是什麼。在每個構建/發佈週期中,我希望他們解除舊戰爭並部署新戰爭。作爲一個方面說明 - 這是我第一次嘗試將應用程序部署爲戰爭,並且我可能錯過了一些最佳做法,因此如果這不是一個好方法,請善意糾正我。

回答

0

我個人而言,不使用manager應用程序安裝的應用程序,我手動配置Tomcat,所以我不能說如何與manager應用程序做到這一點,但這裏是你如何能控制獨立的應用程序上下文路徑戰爭文件名稱。

首先,不建議<Context>server.xml(見Tomcat documentation)。您應該改爲在.../conf/Catalina/localhost文件夾中創建上下文XML文件。

所以,這裏的步驟:

  1. 任何地方複製系統上的WAR文件,但是這個Tomcat文件夾之外,例如/mywars/A-1.0.0.war

  2. 創建文件.../conf/Catalina/localhost/portal.xml

    <Context docBase="/mywars/A-1.0.0.war" reloadable="true" swallowOutput="true"> 
        <Logger className="org.apache.catalina.logger.FileLogger" prefix="www-sample-com-log." suffix=".txt" timestamp="true"/> 
    </Context> 
    

    需要注意的是它不具有path屬性。上下文路徑根據文件名確定,即/portal

  3. 如果需要,重新啓動Tomcat。

    我通常在進行更改之前關閉Tomcat,因此多次更改不會導致多次重新加載。

META-INF/context.xml即使存在,也不使用。

如果你的web應用程序使用servlet初始化參數,配置使用<Context>元素內<Parameter>元素,你甚至可以安裝相同的Web應用程序(WAR文件),在一個Tomcat實例多次,在不同的上下文路徑,每個不同的配置只需在.../conf/Catalina/localhost文件夾中創建多個XML文件即可。

+0

感謝您的回答。這揭示了一些我完全錯過的東西,那就是Tomcat會在'conf/Catalina/localhost /'文件夾中尋找一個xml文件。現在我明白了文檔中的'conf// /'的含義。我明天回去工作時會試試這個。但是我還有一個問題 - 如果下個月我想在舊的1.0.0版本上部署A-2.0.0.war,是否需要添加另一個''(或更改現有的)以匹配新的WAR文件的名稱?現在我在考慮在WAR文件名中加入版本號是一個壞主意...... –

+0

除非您想使兩個版本保持運行,使用不同的上下文路徑,只需更新現有xml文件的'docBase'即可。 – Andreas