多配置Maven执行忽略未指定ID配置及多Tomcat部署问题
解决tomcat7-maven-plugin多服务器部署时配置被忽略的问题
我太懂这个坑了!你遇到的问题核心在于Maven插件的多个执行实例必须通过唯一的<id>来区分,如果没给每个执行配置单独的ID,Maven会把它们当成同一个执行任务处理,要么覆盖要么直接忽略掉那些没ID的配置。
问题根源
当你在插件的<executions>里定义多个部署任务但没指定<id>时,Maven会给所有没ID的执行分配默认ID(比如default-deploy)。这就导致后面的执行配置会覆盖前面的,最终只有最后一个配置生效,其他的部署任务都被忽略了。
解决方案:给每个部署执行配置唯一ID
下面是调整后的pom.xml片段,我给每台服务器的部署任务都加了唯一ID,同时确保每个执行绑定到正确的生命周期阶段:
<profiles> <profile> <id>DevDeployment</id> <activation> <property> <name>!production</name> </property> </activation> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <!-- 务必指定兼容的插件版本 --> <executions> <!-- 部署到第一台开发服务器 --> <execution> <id>deploy-to-dev-1</id> <!-- 唯一ID,不能重复 --> <phase>deploy</phase> <!-- 绑定到deploy生命周期阶段 --> <goals> <goal>deploy</goal> </goals> <configuration> <url>http://dev-server-1:8080/manager/text</url> <server>dev-server-1</server> <!-- 推荐在settings.xml里配置凭证 --> <path>/your-web-app</path> <!-- 可选:如果需要强制覆盖现有应用,加上<update>true</update> --> </configuration> </execution> <!-- 部署到第二台开发服务器 --> <execution> <id>deploy-to-dev-2</id> <!-- 另一个唯一ID --> <phase>deploy</phase> <goals> <goal>deploy</goal> </goals> <configuration> <url>http://dev-server-2:8080/manager/text</url> <server>dev-server-2</server> <path>/your-web-app</path> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
额外优化:安全存储服务器凭证
不要把用户名和密码直接写在pom里,建议在你的settings.xml文件中配置服务器凭证:
<settings> <servers> <server> <id>dev-server-1</id> <!-- 必须和pom里<server>标签的内容完全一致 --> <username>tomcat-admin</username> <password>your-secure-password</password> </server> <server> <id>dev-server-2</id> <username>tomcat-admin</username> <password>your-secure-password</password> </server> </servers> </settings>
执行部署命令
激活DevDeployment profile执行部署:
mvn clean deploy -P DevDeployment
这样Maven就会依次执行每个带唯一ID的部署任务,不会再忽略任何配置了。
内容的提问来源于stack exchange,提问作者Stevan Koncar
相关产品推荐
相关产品推荐

