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



我正在为自定义集成测试编写一个 maven-mojo。问题是现在,我需要 mojo 执行中的 jar 文件。如果我将我的项目配置为在阶段"包"上运行我的自定义插件并运行mvn package,它工作正常,我可以获取文件

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

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

如果要

强制直接调用目标,请使用

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

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

编辑:关于工件文件的问题。请查看Maven-Install-Plugin的源代码。第 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();

注入 MavenProject 的正确方法是通过 @Parameter 而不是通过 @Component 。请参阅评估指南。和注释指南。

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

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

相关内容

  • 没有找到相关文章

最新更新