You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在自定义Maven插件中调用deploy目标实现模块按需部署[Maven插件开发]

解决多模块Maven项目中仅部署变更模块的问题

针对你遇到的自定义插件设置的skip属性无法在后续deploy目标中生效的问题,我整理了两种最直接的解决方案,你可以根据自己的需求选择:

方案一:在自定义插件内部触发Deploy流程

这应该是最贴合你想法的方案:让identify-changes目标完成变更识别后,直接在插件代码里启动deploy目标的执行,这样所有属性都在同一个Maven会话中,不会出现传递失效的问题。

具体实现步骤:

  1. 在插件pom中引入依赖:
    需要用到mojo-executor简化调用其他Maven插件的流程,在自定义插件的pom.xml中添加:

    <dependency>
        <groupId>org.twdata.maven</groupId>
        <artifactId>mojo-executor</artifactId>
        <version>2.3.2</version>
    </dependency>
    
  2. 修改插件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;
        }
    }
    
  3. 使用方式:
    现在只需执行一条命令即可完成全流程:

    mvn custom-plugin:identify-changes
    

方案二:修复属性传递问题,保持命令行多目标执行

如果你更倾向于保留mvn custom-plugin:identify-changes deploy的命令形式,问题大概率出在属性设置的方式上:

关键修复点:

  1. 正确设置Maven会话属性:
    不要用System.setProperty()设置属性,而是存入Maven会话的userProperties,这样后续deploy目标能读取到:

    // 错误方式:System.setProperty("skip.deploy." + module.getArtifactId(), "true");
    // 正确方式:
    session.getUserProperties().setProperty("skip.deploy." + module.getArtifactId(), "true");
    
  2. 确认模块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>
    
  3. 验证属性传递:
    执行命令时加-X参数,查看属性是否正确传递:

    mvn custom-plugin:identify-changes deploy -X
    

    在日志中搜索skip.deploy.关键词,确认每个模块的属性值符合预期。

额外注意事项

  • 建议使用最新版本的maven-deploy-plugin,避免旧版本兼容性问题;
  • 大型多模块项目中,确保变更识别逻辑能高效遍历所有子模块;
  • 可给插件添加参数,允许手动指定跳过某些模块,提升灵活性。

内容的提问来源于stack exchange,提问作者Ruwanka De Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:27