如何使用 maven-tomcat7-plugin 在 Tomcat 上正确热 deploy/redeploy war?

How to properly hot deploy/redeploy war on Tomcat with maven-tomcat7-plugin?

我知道有很多线程在谈论它,但我暴露了一个我无法在他们的帮助下解决的情况。我希望我的问题,如果将来解决了,我可以帮助更多处于我处境的人。

我正在尝试对 Tomcat 中的 war 进行热部署,我发现自己遇到以下四种情况:

案例一

从项目文件夹执行的部署命令:

mvn clean install org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy -P PROFILE_ONE,PROFILE_TWO -Dmaven.skip.test=true -DskipTests=true -Dmaven.javadoc.skip=true -Dsource.skip=true -Dproject.build.sourceEncoding=UTF-8 -Dcobertura.skip=true -Dmaven.skip.test=true -DskipTests=true -Dmaven.javadoc.skip=true -Dsource.skip=true -Dproject.reporting.outputEncoding=UTF-8 -Dmaven.tomcat.path=/MY_PATH -Dmaven.tomcat.url=http://localhost:8081/manager/text -Dmaven.tomcat.server=TomcatServer -Dtomcat.password=TOMCAT_USER -Dtomcat.username=TOMCAT_PASSWORD

AND apache-tomcat-7.0.91\conf\context.xml 具有以下属性:

<Context antiResourceLocking="true" antiJARLocking="true">

案例 1 结果

部署似乎工作正常,但当我进入应用程序时出现以下错误:

This page can not be found (localhost) No web page was found for the address http://localhost:8081/MY_PATH/#/PATH. HTTP ERROR 404

案例二

从项目文件夹和 apache-tomcat-7.0.91\conf\context.xml 执行的情况 1 的相同命令没有防锁定属性:

<Context>

案例2结果

部署和应用程序正常工作,但是当我尝试重新部署时,使用相同的命令并添加 属性 -Dmaven.tomcat.update=true 无法正常工作,因为有几个 jar被阻止并且 tomcat 无法删除它们。 (这就是我在其他情况下添加防锁特性的原因)

案例三

从项目文件夹和 apache-tomcat-7.0.91\conf\context.xml 执行案例 1 的相同命令,具有以下属性:

<Context antiJARLocking="true">

案例三结果

等于情况2的结果

案例4

从项目文件夹和 apache-tomcat-7.0.91\conf\context.xml 执行案例 1 的相同命令,具有以下属性:

<Context antiResourceLocking="true">

案例4结果

等于案例1的结果

案例结束

如您所见,我的目标是进行首次部署,然后重新部署相同的应用程序(在项目文件夹中进行更改)。我找到的所有信息都在谈论防锁定属性,但正如我上面所说,当我将它们放在 context.xml 上时,应用程序似乎无法正常工作。重要的是要说,由于项目需要,我无法更改 war.

的名称

编辑 1

案例5

我也尝试过以下命令:

mvn clean install -U -P PROFILE_ONE,PROFILE_TWO -Dmaven.skip.test=true -DskipTests=true -Dmaven.javadoc.skip=true -Dsource.skip=true -Dproject.build.sourceEncoding=UTF-8 -Dcobertura.skip=true -Dmaven.skip.test=true -DskipTests=true -Dmaven.javadoc.skip=true -Dsource.skip=true -Dproject.reporting.outputEncoding=UTF-8 org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:redeploy-only -Dmaven.tomcat.path=/MY_PATH -Dmaven.tomcat.url=http://localhost:8081/manager/text -Dmaven.tomcat.server=TomcatServer -Dtomcat.password=admin -Dtomcat.username=admin

和 apache-tomcat-7.0.91\conf\context.xml 具有以下属性:

<Context antiResourceLocking="true">

案例5结果KO

等于案例1的结果

为什么antiResourceLocking="true"导致结果 1 错误?

根据 Tomcat:

,您不应该同时使用 antiResourceLockingantiJARLocking 功能

antiJARLocking is a subset of antiResourceLocking and therefore, to prevent duplicate work and possible issues, only one of these attributes should be set to true at any one time.

还有关于使用 antiResourceLocking

的具体警告

Please note that setting this to true has some side effects, including the disabling of JSP reloading in a running server: see Bugzilla 37668.

Please note that setting this flag to true in applications that are outside the appBase for the Host (the webapps directory by default) will cause the application to be deleted on Tomcat shutdown. You probably don't want to do this, so think twice before setting antiResourceLocking=true on a webapp that's outside the appBase for its Host.