2011-05-03 158 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>