exec-maven-plugin配置两个execution仅执行一次问题求助
解决exec-maven-plugin多任务执行跳过的问题
我之前也碰到过一模一样的问题——想用exec-maven-plugin跑Avro的两个生成任务,结果不管怎么配都只跑一个,折腾了好一阵子才搞明白问题出在哪。给你几个靠谱的解决方案,不用改CI/CD流水线就能搞定:
方案一:用多Execution绑定生命周期阶段
这是最推荐的方式,把两个Avro任务绑定到Maven的生命周期阶段(比如generate-sources,编译前自动执行),这样执行常规构建命令时会自动触发两个任务。核心要点是给每个Execution设置唯一ID,并明确指定执行阶段:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <!-- 用最新稳定版,老版本对多Execution支持有坑 --> <version>3.1.0</version> <executions> <!-- 生成Avro Schema的任务 --> <execution> <id>avro-generate-schema</id> <!-- 绑定到编译前的generate-sources阶段 --> <phase>generate-sources</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>com.yourpackage.AvroSchemaGenerator</mainClass> <!-- 这里填你的Schema生成参数,比如输入路径、输出路径 --> <arguments> <argument>--input-dir=src/main/avro</argument> <argument>--schema-output-dir=target/generated-resources/avro/schemas</argument> </arguments> </configuration> </execution> <!-- 生成Java源代码的任务 --> <execution> <id>avro-generate-java</id> <phase>generate-sources</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>com.yourpackage.AvroJavaGenerator</mainClass> <arguments> <argument>--input-dir=src/main/avro</argument> <argument>--java-output-dir=target/generated-sources/avro/java</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build>
配置完成后,执行mvn clean compile或者mvn clean install,两个任务就会自动按顺序执行。
避坑指南
你之前碰到的“跳过一个任务”问题,大概率是以下原因之一:
- Execution ID重复或未设置:Maven会跳过ID重复的Execution,所以一定要给每个任务设唯一ID
- 未绑定生命周期阶段:如果没指定
<phase>,插件只会在你手动调用exec:java时执行,且默认只会跑第一个匹配的配置 - 用了两个独立的
<plugin>节点:如果把两个任务拆成两个<plugin>标签(即使groupId/artifactId相同),Maven会认为是重复配置,自动合并跳过其中一个,所以一定要把所有Execution放在同一个<plugin>节点下 - 插件版本过旧:老版本的exec-maven-plugin对多Execution支持有bug,建议升级到3.0.0以上的稳定版
验证方法
配置好后,你可以执行mvn generate-sources单独测试这个阶段的执行情况,控制台会输出两个任务的执行日志,确认都成功运行后,CI/CD流水线只需要保留原来的构建命令即可,完全不用修改。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

