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

如何让自定义Maven Mojo(mojo-a)有条件预执行copy-dependencies?

实现Maven Mojo的执行检查与自动触发逻辑

核心思路

要实现mojo-a检查copy-dependencies是否已执行,并在未执行时自动触发,关键是利用Maven的MavenSession获取已执行的Mojo记录,再通过BuildPluginManager调用目标Mojo。

实现步骤与代码示例

1. 注入必要的Maven组件

在你的mojo-a类中,注入核心依赖组件:

import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.project.MavenProject;

@Mojo(name = "mojo-a")
public class MojoA extends AbstractDependencyMojo {

    @Component
    private MavenSession session;

    @Component
    private BuildPluginManager pluginManager;

    @Component
    private MavenProject project;
}

2. 检查copy-dependencies的执行状态

遍历当前会话中已执行的Mojo列表,匹配目标插件和Mojo名称:

private boolean isCopyDependenciesExecuted() {
    // 遍历会话中已执行的所有Mojo记录
    for (MojoExecution execution : session.getResult().getExecutedMojos()) {
        // 匹配插件的groupId、artifactId以及目标Mojo名称
        if ("org.apache.maven.plugins".equals(execution.getGroupId())
                && "maven-dependency-plugin".equals(execution.getArtifactId())
                && "copy-dependencies".equals(execution.getGoal())) {
            return true;
        }
    }
    return false;
}

3. 自动触发未执行的copy-dependencies

在execute方法中加入判断逻辑,未执行时调用BuildPluginManager执行目标Mojo:

@Override
public void execute() throws MojoExecutionException {
    // 先检查copy-dependencies是否已执行
    if (isCopyDependenciesExecuted()) {
        getLog().info("copy-dependencies 已执行,跳过自动触发");
        return;
    }

    getLog().info("copy-dependencies 未执行,开始自动触发");
    
    try {
        // 构建Mojo执行实例,指定插件坐标和目标
        MojoExecution execution = new MojoExecution(
                "org.apache.maven.plugins:maven-dependency-plugin:copy-dependencies",
                project.getBuild().getPluginsAsMap()
        );
        
        // 传递必要配置参数(例如outputDirectory,可复用项目现有配置)
        execution.setConfiguration(getPluginContext());
        
        // 执行目标Mojo
        pluginManager.executeMojo(session, execution);
    } catch (Exception e) {
        throw new MojoExecutionException("自动触发copy-dependencies失败", e);
    }
}

关键注意事项

  • 生命周期阶段匹配:确保mojo-a的执行阶段晚于copy-dependencies可能执行的阶段(比如copy-dependencies通常在package阶段,mojo-a应配置在package或更靠后的阶段),否则会出现误判。
  • 参数传递:如果copy-dependencies需要自定义参数(如outputDirectory、includeScope),要在setConfiguration中正确设置,可直接复用当前项目中该插件的配置。
  • API兼容性:确认使用的Maven API版本与插件依赖的Maven版本一致,避免因API变更导致调用失败。

内容的提问来源于stack exchange,提问作者ly0932

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:10:58