如何在 Maven mojo 中使用 MavenBuildHelper

Posted

技术标签:

【中文标题】如何在 Maven mojo 中使用 MavenBuildHelper【英文标题】:How to use MavenBuildHelper in Maven mojo 【发布时间】:2016-11-29 23:33:41 【问题描述】:

我正在开发一个带有多个 Mojo 的 maven 插件。在其中之一中,我的目标是在我的项目中附加额外的工件。类似于attach-artifact of maven-build-helper-plugin。但我不想使用任何给定的构建插件,我想通过我的 Mojo 来完成。

我知道我必须使用MavenProjectHelper.attachArtifact。因为 MavenProject.attachArtifact 已被弃用。

我现在拥有的是这个(在 mojo.java 中):

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

@Parameter(defaultValue = "$helper", required = true, readonly = true)
protected MavenProjectHelper projectHelper;

execute方法中:

projectHelper.attachArtifact(project, "plugin", file);

但问题是,MavenProjectHelper 的默认值不是$helper。这就是为什么,我收到以下错误:

Failed to execute goal com.company.product.repo:my-plugin:1.0.1:attach-artifact (default) on project consumer-plugin: The parameters 'projectHelper' for goal com.company.product.repo:my-plugin:1.0.1:attach-artifact are missing or invalid -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginParameterException

如何给它正确的值?就像MavenSession$session 一样,我假设MavenProjectHelper 有一个默认值。如果是这样,它是什么?如果不是,那我怎样才能给MavenProjectHelper参数正确的值?

【问题讨论】:

【参考方案1】:

MavenProjectHelper 是 Plexus 组件,而不是插件参数,应通过使用 @org.apache.maven.plugins.annotations.Component 注释对其进行注解来注入:

用于配置MavenPluginManager.getConfiguredMojo(...)对Plexus组件的注入。

因此,您应该改为:

@Component
private MavenProjectHelper projectHelper;

这个注解,就像@Parameter一样,带有Plugin Tools注解,你可以在你的Maven插件的POM中声明

<dependency>
  <groupId>org.apache.maven.plugin-tools</groupId>
  <artifactId>maven-plugin-annotations</artifactId>
  <version>3.5</version>
  <scope>provided</scope>
</dependency>

为了进一步说明,PluginParameterExpressionEvaluator 类的 Javadoc 中记录了您可以使用 @Parameter 注入的内容(其中,session 用于 Maven 会话,project 用于当前 Maven 项目或 mojoExecution用于当前的 Mojo 执行)。

【讨论】:

谢谢!有效。如果我必须手动给出role 的值,它会是什么,我在哪里可以找到它?比如MavenResourcesFiltering,我用的是role = org.apache.maven.shared.filtering.MavenResourcesFiltering.class @ChurchillNolan 角色默认为注解类型的类。例如,如果您想将某些内容注入到类型不是组件类的字段中,则需要它。示例:Archiver 有多个实现,例如 JarArchiver。如果您特别想要JarArchiver,而不是其他任何类型,那么您的字段将是JarArchiver 类型,因此您需要告诉角色是Archiver.class(因为JarArchiver 是角色@ 的一个组成部分987654346@)。通常,您会使用 hint,因为您需要区分要注入的内容类型。

以上是关于如何在 Maven mojo 中使用 MavenBuildHelper的主要内容,如果未能解决你的问题,请参考以下文章

你如何强制一个 maven MOJO 在构建结束时只执行一次?

如何从自定义 maven mojo 创建 maven 配置文件

什么是 Maven 中的 MOJO?

从自定义 mojo 访问 maven 插件的运行时配置的最佳方式?

我的Dojo中有一个Mojo(如何编写Maven插件)

解决maven插件问题:'无法加载mojo'