我正在为自定义集成测试编写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“准备好了”?我在这里做错了吗?
答案 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();