【问题标题】:Maven Mojo: execute to "package" and get .jarMaven Mojo:执行“打包”并获取 .jar
【发布时间】:2015-03-15 23:21:19
【问题描述】:

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

【问题讨论】:

  • 您的集成测试有什么特别之处会很有趣吗?能再详细一点吗?
  • 好吧,集成测试可能是错误的词。我想做的是像 jetty:run 这样的事情。我的软件/项目有点像一个插件,所以我想用我的 .jar 作为参数启动其他软件,所以我的其他软件加载它并可以告诉我,我的项目是否正常工作。

标签: maven mojo


【解决方案1】:

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

@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();

【讨论】:

  • 谢谢,这会有所帮助,但这不会给我打包的 .jar 的“文件”。当然,我可以通过使用 finalName 和 buildpath(?) 自己构建文件对象,但我不认为这是“最好的”和最干净的方式,必须有一种从 maven 获取它的方法。
  • 你确定之前调用过打包阶段吗?关于您的问题, maven-install-plugin 什么也不做。它在打包阶段之后运行并尝试安装打包的工件。因此它需要jar文件。
【解决方案2】:

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

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

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

【讨论】:

  • 好吧,我会这样做,将插件绑定到“包”,问题是,它会在我每次安装或部署时运行外部软件。如果我直接调用我的目标,我真的只想运行它。即码头:运行如何做到这一点? jetty:run 也需要编译才能运行服务器。
  • 看看@gclaussn 答案,这是缺少的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2013-04-20
  • 2014-05-09
  • 2017-05-12
  • 2019-07-13
相关资源
最近更新 更多