2011-05-03 197 views
23

目前,如果我在tomcat上部署名爲say myapp.war的戰爭文件,我可以通過http://localhost/myapp/MyServlet訪問它的url。從戰爭文件名中分離戰爭應用程序名稱

然而,我想要的是在戰爭文件名中部署與版本號戰爭,並仍然具有相同的網址。 對於例如,我要部署myapp-1.1.0.war,仍然有URL中http://localhost/myapp/MyServlet

當然,我需要不斷更新戰爭和版本號會不斷變化,所以我不能在任何地方硬編碼的戰爭文件名。 有沒有在web.xml任何設置我可以用來保持相同的應用程序的網址,無論戰爭文件名?

+0

如果你只是想添加一個版本信息到您的文件名,請檢查我對這個問題的回答:http://stackoverflow.com/a/33822607/1458639 – 2015-12-03 10:49:45

回答

7

您可以對此使用YOUR_WAR/META-INF/context.xml。下面是一個示例:

<?xml version="1.0" encoding="UTF-8"?> 
<Context antiJARLocking="true" path="/MyServlet"/> 
+1

@Matthew Gillard據我所知,tomcat文檔說不要在服務器中放置一個Context元素。 XML。它們在META-INF/context.xml中沒有問題。文檔甚至會告訴你context.xml如何工作。從文檔:「上下文元素可以明確定義: *在$ CATALINA_BASE/conf/context.xml文件中:上下文元素信息將由所有webapps加載。」 – 2011-05-03 21:03:46

+2

我誤讀了嗎? 「路徑」部分說: 「除了靜態定義server.xml中的上下文之外,不得設置此字段的值」 – 2011-05-03 21:08:44

+0

我認爲此區域中的tomcat行爲(和文檔!)非常混亂。其中最重要的是:如果您決定要更改Web應用程序的上下文根目錄,則必須手動從$ CATALINA_BASE/conf中刪除文件(該頁面上的介紹部分的5個項目符號點的第4個) – 2011-05-03 21:13:14

13

解決方法是停止使用Tomcat,這需要設置「上下文名稱」的快捷方式(URL的/myapp一部分)WAR的部分的自動部署功能「.war」之前的文件名。

相反,提取WAR內容到文件系統自己和設置在TOMCAT_HOME/conf/[enginename]/[hostname]/[contextname].xml一個XML文件,其指向所期望的上下文路徑(如/myapp)到應用程序的磁盤(如/opt/webapps/myapp-1.1.0/)的位置。

Tomcat reference docs很好地解釋了Tomcat如何自動部署應用程序,以及如何配置用於將上下文路徑映射到應用程序文件位置的自定義邏輯(還有一些替代方法可以將其設置爲非我建議上面)。

+3

這是否意味着我每次使用更新的文件名部署新版本的戰爭時,都必須更新.xml文件? – pdeva 2011-05-03 22:28:37

+1

我有點困惑。在這種情況下,'myapp.xml'文件的內容應該指向戰爭的位置? – pdeva 2011-05-04 08:50:29

+1

類似於''。 Tomcat將使用文件的名稱,不帶'.xml'擴展名作爲上下文路徑。關於我的符號鏈接建議,我剛剛在文檔中注意到它聲明'如果符號鏈接用於docBase,那麼只有在Tomcat重新啓動或取消部署和重新部署上下文後,纔會對符號鏈接進行更改。上下文重新加載是不夠的。# – 2011-05-04 12:03:55

1

web.xml中沒有爲此設置。我不認爲有可能以跨容器的方式將其設置在戰爭文件中 - 無論如何,在規範中沒有提及它 - 因此每個容器都以不同的方式進行。 jboss-web.xmlsun-web.xmlcontext.xml

4

當使用Maven您可以通過執行以下控制部署的路徑:

的Tomcat的conf/tomcat的-users.xml中:

<tomcat-users> 
    <role rolename="manager-gui"/> 
    <role rolename="manager-script"/> 
    <role rolename="manager-jmx"/> 
    <role rolename="manager-status"/> 
    <role rolename="admin-gui"/> 
    <role rolename="admin-script"/> 

    <user username="root" password="root" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/> 

</tomcat-users> 

〜/ .m2目錄/ settings.xml中:

... 
<server> 
    <id>tomcat</id> 
    <username>root</username> 
    <password>root</password> 
</server> 
... 

的pom.xml:

... 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</groupId> 
    <artifactId>myapp</artifactId> 
    <version>1.1.0</version> 
    <packaging>war</packaging> 
... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>tomcat-maven-plugin</artifactId> 
     <configuration> 
      <!-- neglect /html below Tomcat7: --> 
      <url>http://server:8080/manager/html</url> 
      <!-- Refer to the server settings in your ~/.m2/settings.xml --> 
      <server>tomcat</server> 
      <path>/myWebApp</path> 
     </configuration> 
     </plugin> 
     .... 
    </plugins> 
    </build> 
... 

啓動Tomcat的第一 然後構建和部署應用程序..

mvn clean install tomcat:deploy 

..它會根據http://server:8080/myWebApp

+0

@nir感謝您的更正 – 2014-08-19 22:09:44

0

訪問我遇到同樣的問題,而事實上,作爲@matt提到,Tomcat reference docs很好地解釋了Tomcat如何自動部署應用程序,以及如何配置用於將上下文路徑映射到應用程序文件位置的自定義邏輯。

在我的情況,我用這個建議(在「路徑」的解釋):

即使靜態定義在server.xml中一個背景下,這個屬性(/路徑) 必須設置除非docBase不在 主機的應用程序庫或下,否則deployOnStartup和autoDeploy都是錯誤的。如果 未遵循此規則,則可能會導致雙重部署。

所以在我的情況,我都切換和deployOnStartupautoDeploy假,所以我的WAR(egaWAR)不是自動爆炸下的webapps「A」目錄,而是爲「B」目錄,由於這些設置:

<Host name="localhost" appBase="webapps" 
      autoDeploy="false" deployOnStartup="false" 
      unpackWARs="true" deployIgnore="${ignore.context}"> 

    <Context docBase="a" path="/b" /> 

</Host>