多模块Maven项目中子模块maven-release-plugin目标被忽略的问题
嘿,我来帮你搞定这个Maven多模块发布时触发额外目标的问题!针对你这种types/client是JAR、service是WAR的多模块项目,要让maven-release-plugin在发布service时调用额外目标,关键是在service模块的pom里做针对性配置,同时踩准release插件的执行节奏。
1. 把额外目标绑定到release对应的生命周期阶段
release插件的核心流程是release:prepare(准备版本、打标签)和release:perform(执行发布、部署)。如果你想让额外插件目标跟着service的发布走,最简单的方式是把它绑定到Maven的生命周期阶段里,比如install或者deploy阶段——毕竟release:perform本质上就是在标签代码里执行完整的生命周期。
举个例子,假设你要调用custom-plugin:deploy-war这个目标,在service的pom.xml里这么配:
<build> <plugins> <!-- 先定义你要调用的额外插件 --> <plugin> <groupId>com.yourcompany</groupId> <artifactId>custom-plugin</artifactId> <version>2.1.0</version> <executions> <execution> <id>run-on-service-release</id> <!-- 绑定到deploy阶段,确保在WAR包部署后执行 --> <phase>deploy</phase> <goals> <goal>deploy-war</goal> </goals> <!-- 插件需要的参数在这里配置 --> <configuration> <targetEnv>production</targetEnv> </configuration> </execution> </executions> </plugin> <!-- 给release插件做个小配置,确保它触发完整生命周期 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>3.0.1</version> <configuration> <!-- 指定perform阶段执行的生命周期目标,默认就是deploy,这里明确写出来更保险 --> <goals>deploy</goals> </configuration> </plugin> </plugins> </build>
2. 直接让release-plugin在perform阶段调用额外目标
如果不想绑定到生命周期,而是想让release插件在执行完默认流程后直接调用额外目标,可以用additionalGoals参数,记得加上inherit=false防止其他子模块继承这个配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>3.0.1</version> <configuration> <!-- 在perform阶段完成默认操作后,额外执行的目标 --> <additionalGoals>custom-plugin:deploy-war</additionalGoals> <!-- 关键!只让service模块用这个配置,别影响types和client --> <inherit>false</inherit> </configuration> </plugin>
3. 多模块发布的小细节要注意
因为你的service依赖types和client,release插件会自动按照依赖顺序先处理types、client,再处理service。如果你的额外目标需要用到已发布的types/client包,一定要在release:perform阶段执行——这时候这两个模块已经被安装到本地仓库或者推送到远程仓库了,不会出现依赖找不到的问题。
4. 先做干运行测试!
正式发布前,一定要跑mvn release:prepare -DdryRun=true做个干运行,检查额外目标是不是真的会被触发,避免发布到一半出问题。另外,尽量用3.x以上版本的maven-release-plugin,旧版本在子模块配置继承上容易出bug。
内容的提问来源于stack exchange,提问作者Nick Pillitteri

