如何为Tomcat的WAR文件做版本控制并避免生成冗余部署目录
解决Tomcat同时生成main和main-1目录并启动双实例的问题
问题原因
你遇到的问题是Tomcat的**自动部署(autoDeploy)**特性与手动配置的<Context>冲突导致的:
main-1.war放在webapps目录下,Host的autoDeploy="true"会自动扫描并部署该WAR包,生成main-1目录并启动对应实例;- 同时你手动配置的
<Context>路径配置有误,导致Tomcat额外生成main目录,相当于重复部署了两次应用。
解决方案
方案一:将WAR包移出webapps目录(推荐)
把main-1.war放到webapps之外的独立目录(比如/tomcat/apps/),修改server.xml中的<Context>配置,指定WAR包的绝对路径:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/main" docBase="/tomcat/apps/main-1.war" debug="0" reloadable="true"></Context> </Host>
这样Tomcat不会自动部署该WAR包(不在webapps目录内),只有手动配置的/main应用生效,不会生成多余的main-1目录。
方案二:保留WAR在webapps,阻止自动部署该WAR
如果需要把WAR包留在webapps目录,添加<DeployIgnore>规则让Tomcat忽略main-1.war的自动部署,同时修正docBase指向正确的WAR文件:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <DeployIgnore>main-1\.war</DeployIgnore> <Context path="/main" docBase="main-1.war" debug="0" reloadable="true"></Context> </Host>
<DeployIgnore>使用正则表达式匹配要忽略的WAR包,注意转义点号(.);docBase直接写main-1.war即可(WAR在webapps目录下,相对路径有效)。
额外提示
- 如果不需要解压WAR包运行,可将
unpackWARs="false",Tomcat不会生成任何解压目录,直接从WAR包加载应用; - 官方不推荐直接在
server.xml中配置<Context>,更优雅的方式是在conf/Catalina/localhost/下创建main.xml文件,内容为:
这样无需修改<Context docBase="/tomcat/apps/main-1.war" debug="0" reloadable="true"></Context>server.xml,也能实现将main-1.war部署为/main路径的效果,配合方案一的WAR存放方式,可彻底避免自动部署冲突。
内容的提问来源于stack exchange,提问作者user2023141
相关产品推荐
相关产品推荐

