如何让exec-maven-plugin仅在WAR包构建完成后执行一次?
解决方案:让exec-maven-plugin仅在WAR生成后执行一次
1. 限制插件仅在WAR子项目中执行
如果父项目是pom类型,仅在生成WAR的子项目(war打包类型)的pom.xml中配置exec-maven-plugin,不要将插件配置放在父项目的全局<build><plugins>块中。这样插件只会在该war子项目的构建流程中触发,不会波及其他子项目。
若需在父项目中通过<pluginManagement>统一管理插件版本,可在父项目的插件配置中添加<inherited>false</inherited>,然后在war子项目中显式引入该插件并配置执行逻辑,确保其他子项目不会继承执行该插件。
2. 解决删除target后找不到WAR的异常
- 绑定到正确的Maven阶段:将插件绑定到
package阶段之后的阶段(如verify或install)。package阶段是Maven生成WAR包的核心阶段,绑定到后续阶段能确保WAR文件已存在于target目录。示例配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>upgrade-war-to-jakarta</id> <phase>verify</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>你的升级脚本路径或命令</executable> <arguments> <argument>${project.build.directory}/${project.build.finalName}.war</argument> </arguments> <!-- 当WAR文件不存在时跳过执行 --> <skip>${!file.exists('${project.build.directory}/${project.build.finalName}.war')}</skip> </configuration> </execution> </executions> </plugin>
- 添加文件存在性检查:利用Maven内置的
file.exists()属性判断WAR文件是否存在,若不存在则自动跳过插件执行,避免抛出文件未找到的异常。 - 确认GWT插件的编译阶段(如
compile或gwt:compile)早于package阶段,保证WAR生成前GWT代码已完成编译。
验证流程
执行mvn clean verify测试:删除target目录后,Maven会先完成编译、打包生成WAR,再触发exec插件执行升级操作,且仅在war子项目中执行一次。
内容的提问来源于stack exchange,提问作者Tugalsan Karabacak
相关产品推荐
相关产品推荐

