如何在 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 配置文件