这就是我在问题How do I get Maven to create an appropriately named .war for use with Tomcat 7's parallel deployment feature? 中的意思。
您的问题确实是它的要点。下面是我所做的。
首先,让 Maven 生成正确命名的 .war 文件。我使用了 Maven 的时间戳插件。
...
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>${war.version}</version>
<configuration>
<warName>${war.name}</warName>
</configuration>
</plugin>
...
使用时间戳作为版本可确保 .war 文件根据 Tomcat 7 用于确定最新版本的规则正确命名。
我找不到任何有关让 Tomcat 7 Maven 插件使用此插件的信息。在 Tomcat IRC 和 Maven IRC 上询问。也许这是可能的,但我无法让它工作。
我做的是这样的:
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>install</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${group.id}</groupId>
<artifactId>${artifact.id}</artifactId>
<version>${version}</version>
<type>war</type>
<overWrite>true</overWrite>
<outputDirectory>${autodeploy.directory}</outputDirectory>
<destFileName>${war.name}.war</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
...
这只是将文件从一个地方复制到另一个地方。在这种情况下,您构建到 Tomcat 的 autodeploy 目录的 .war。
如果您使用 Jenkins 进行部署,您可以将副本设置为构建后操作。 (使用 target/appname*.war 作为 EAR/WAR 文件名。)
为了完整起见,这里引用了各种属性:
<properties>
<artifact.id>myApp</artifact.id>
<version>1.0</version>
<group.id>com.example.${artifact.id}</group.id>
<autodeploy.directory xml:space="preserve">C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps</autodeploy.directory>
<war.name>${artifact.id}##${maven.build.timestamp}</war.name>
...
(请注意xml:space="preserve",以便在目录中有空格时让 Windows 开心。)
Tomcat 7 默认会自动部署,但不会删除旧版本。也许这就是您想要的,因为您将拥有所有旧版本,以防万一您搞砸了并且需要取消部署最新版本。
但是如果你想用钢笔写,可以这么说,从你的 Tomcat 7 安装目录中找到 conf/server.xml。让<Host> 看起来像这样:
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" undeployOldVersions="true">
undeployOldVersions="true" 是魔法。
真的是这样。现在,当你执行maven clean install 时,它会构建一个命名良好的战争并将其放入 Tomcat 的自动部署目录中,它应该可以正常工作。
-科林