如何让自定义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
相关产品推荐
相关产品推荐

