Maven Mojo:执行" package"并得到.jar

时间:2015-01-17 12:27:35

标签: maven mojo

我正在为自定义集成测试编写maven-mojo。问题是现在,我需要mojo执行中的jar文件。如果我配置我的项目在阶段“包”上运行我的自定义插件并运行mvn package,它工作得很好,我可以用

获取文件
@Component( role = MavenProject.class )
private MavenProject project;
//.... in execute:
project.getArtifact().getFile()

但如果我自己运行目标mvn mypluginname:mygoal,则getFile()只返回null。我的mojo-class用@Execute( phase = LifecyclePhase.PACKAGE )注释,不应该执行所有生命周期来“打包”,所以.jar“准备好了”?我在这里做错了吗?

2 个答案:

答案 0 :(得分:0)

注入MavenProject的正确方法是@Parameter,不再是@Component。请参阅evaluation guide.annotation guide

@Parameter( defaultValue = "${project}", readonly = true, required = true )
private MavenProject mavenProject;

除此之外,如果您使用@Execute注释MOJO,则意味着分叉生命周期,只有在lify-cycle期间调用mojo才有意义。除了分叉生命周期通常不是一个好主意。如果您已经构建了jar的先决条件,则只使用包生命周期作为默认绑定。

答案 1 :(得分:0)

如果您想强制直接调用目标,请使用

  

@requiresDirectInvocation:将此Mojo标记为直接调用。

配置你的Mojo这样做。此外,如果尚未打包jar文件(尚未调用默认生命周期的包阶段),我建议抛出 org.apache.maven.plugin.MojoExecutionException 。尝试指定错误消息,该消息尽可能地描述了该情况。你的插件的用户必须知道,他必须在运行插件的目标之前打包jar。

修改 关于工件文件的问题。请查看Maven-Install-Plugin的source code。第188-191行显示了如何获取工件文件。

// Inject Maven project
@Parameter( defaultValue = "${project}", readonly = true, required = true )
private MavenProject project;

// ...

// Mojo#excute() code
Artifact artifact = project.getArtifact();
File pomFile = project.getFile();

ArtifactMetadata metadata = new ProjectArtifactMetadata( artifact, pomFile );
artifact.addMetadata( metadata );

File file = artifact.getFile();