在自定义Maven插件中调用deploy目标实现模块按需部署[Maven插件开发]
解决多模块Maven项目中仅部署变更模块的问题
针对你遇到的自定义插件设置的skip属性无法在后续deploy目标中生效的问题,我整理了两种最直接的解决方案,你可以根据自己的需求选择:
方案一:在自定义插件内部触发Deploy流程
这应该是最贴合你想法的方案:让identify-changes目标完成变更识别后,直接在插件代码里启动deploy目标的执行,这样所有属性都在同一个Maven会话中,不会出现传递失效的问题。
具体实现步骤:
在插件pom中引入依赖:
需要用到mojo-executor简化调用其他Maven插件的流程,在自定义插件的pom.xml中添加:<dependency> <groupId>org.twdata.maven</groupId> <artifactId>mojo-executor</artifactId> <version>2.3.2</version> </dependency>修改插件Mojo代码:
在identify-changes的执行逻辑末尾,添加触发deploy的代码,同时确保属性存入Maven会话的userProperties中:import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.BuildPluginManager; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import static org.twdata.maven.mojoexecutor.MojoExecutor.*; @Mojo(name = "identify-changes") public class IdentifyChangesMojo extends AbstractMojo { @Parameter(defaultValue = "${session}", readonly = true) private MavenSession session; @Component private BuildPluginManager pluginManager; @Parameter(defaultValue = "${project}", readonly = true) private MavenProject project; @Override public void execute() throws MojoExecutionException, MojoFailureException { // 1. 你的核心逻辑:识别变更模块,设置对应的skip.deploy属性 for (MavenProject module : session.getProjects()) { boolean isChanged = checkIfModuleChanged(module); // 替换成你的变更判断逻辑 session.getUserProperties().setProperty( "skip.deploy." + module.getArtifactId(), Boolean.toString(!isChanged) ); } // 2. 触发deploy目标执行 executeMojo( plugin(groupId("org.apache.maven.plugins"), artifactId("maven-deploy-plugin"), version("3.1.1")), goal("deploy"), configuration(), executionEnvironment(session, pluginManager, project) ); } // 替换成你的实际变更检查逻辑(比如Git提交、文件变更判断) private boolean checkIfModuleChanged(MavenProject module) { // 示例逻辑,按需修改 return true; } }使用方式:
现在只需执行一条命令即可完成全流程:mvn custom-plugin:identify-changes
方案二:修复属性传递问题,保持命令行多目标执行
如果你更倾向于保留mvn custom-plugin:identify-changes deploy的命令形式,问题大概率出在属性设置的方式上:
关键修复点:
正确设置Maven会话属性:
不要用System.setProperty()设置属性,而是存入Maven会话的userProperties,这样后续deploy目标能读取到:// 错误方式:System.setProperty("skip.deploy." + module.getArtifactId(), "true"); // 正确方式: session.getUserProperties().setProperty("skip.deploy." + module.getArtifactId(), "true");确认模块Deploy插件配置正确:
每个子模块的pom.xml中,maven-deploy-plugin要正确引用对应skip属性:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>3.1.1</version> <configuration> <skip>${skip.deploy.${project.artifactId}}</skip> </configuration> </plugin>验证属性传递:
执行命令时加-X参数,查看属性是否正确传递:mvn custom-plugin:identify-changes deploy -X在日志中搜索
skip.deploy.关键词,确认每个模块的属性值符合预期。
额外注意事项
- 建议使用最新版本的
maven-deploy-plugin,避免旧版本兼容性问题; - 大型多模块项目中,确保变更识别逻辑能高效遍历所有子模块;
- 可给插件添加参数,允许手动指定跳过某些模块,提升灵活性。
内容的提问来源于stack exchange,提问作者Ruwanka De Silva
相关产品推荐
相关产品推荐

