将war应用程序名称与war文件名分隔开
目前,如果我在名为myapp.war
tomcat上部署war文件,我可以通过http:// localhost / myapp / MyServlet访问其URL。
但是我想要的是在war文件名中部署一个带有版本号的war并且仍然具有相同的url。 例如,我想部署myapp-1.1.0.war
并且仍然将URL设置为http:// localhost / myapp / MyServlet
当然我需要不断更新战争,版本号会不断变化,所以我不能在任何地方硬编码war文件名。 我是否可以使用web.xml
任何设置来保持应用程序的相同url,而不管war文件名是什么?
解决方案是停止使用Tomcat的自动部署function,该function采用将“上下文名称”(URL的/myapp
部分)设置为“.war”之前的WAR文件名部分的快捷方式。
而是自己将WAR内容提取到文件系统,并在TOMCAT_HOME/conf/[enginename]/[hostname]/[contextname].xml
中设置XML文件,该文件将所需的上下文路径(例如/myapp
)指向该位置。磁盘上的应用程序(例如/opt/webapps/myapp-1.1.0/
)。
Tomcat参考文档很好地解释了Tomcat如何自动部署应用程序,以及如何配置自定义逻辑以将上下文路径映射到应用程序文件位置(除了我建议的那个之外,还有一些其他方法来设置它以上)。
您可以使用YOUR_WAR / META-INF / context.xml。 这是一个示例:
使用Maven时,您可以通过执行以下操作来控制部署的路径:
Tomcat的conf / tomcat-users.xml:
〜/ .m2 / settings.xml:
... tomcat root root ...
pom.xml:
... 4.0.0 com.example myapp 1.1.0 war ... org.codehaus.mojo tomcat-maven-plugin http://server:8080/manager/html tomcat /myWebApp .... ...
首先启动tomcat然后构建并部署应用程序..
mvn clean install tomcat:deploy
..it可以在http://server:8080/myWebApp
web.xml中没有为此设置。 我不相信有可能以交叉容器的方式在war文件中设置它 – 在规范中没有提到它 – 所以每个容器都以不同的方式做到这一点。 jboss-web.xml
, sun-web.xml
, context.xml
等。
我更喜欢使用“ ## ”符号来记录tomcat中* .war文件的版本。
例如:
myapp.war
– > URL: http:// localhost:8080 / myapp / MyServlet
myapp##1.1.0
– > URL: http:// localhost:8080 / myapp / MyServlet (仍然相同,因为“ ## ”之后的所有符号都被tomcat忽略)
我遇到了同样的问题,事实上,正如@matt所提到的, Tomcat参考文档很好地解释了Tomcat如何自动部署应用程序,以及如何为上下文路径到应用程序文件位置的映射配置自定义逻辑。
就我而言,我使用了这个建议(在“路径”解释中):
即使在server.xml中静态定义Context,也不能设置此属性(/ path),除非docBase不在Host的appBase下,或者deployOnStartup和autoDeploy都为false 。 如果未遵循此规则,则可能会导致双重部署。
所以在我的情况下,我将deployOnStartup
和autoDeploy
都切换为false,因此我的WAR(egaWAR)没有自动展开到webapps下的’a’目录,而是自动展开到’b’目录,由于这些设置: