2016-11-29 30 views
1

我正在开发一个带有多个Mojos的maven-plugin。其中之一,我的目标是附加额外的神器到我的项目。类似于attach-artifact of maven-build-helper-plugin。但我不想使用任何给定的构建插件,我想通过我的Mojo来完成。我知道我必须使用MavenProjectHelper.attachArtifact。因为MavenProject.attachArtifact已被弃用。如何在Maven mojo中使用MavenBuildHelper

我现在有这个(在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 

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

回答

1

MavenProjectHelper是丛组件,而不是一个插件参数,并应通过与@org.apache.maven.plugins.annotations.Component注解做到这被注入:

Used to configure injection of Plexus components by MavenPluginManager.getConfiguredMojo(...) .

因此,你应该改为:

@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> 

为了进一步澄清,你可以(在Maven的会议,project当前Maven项目或mojoExecution当前的Mojo执行等等,session)注射用什么是@ParameterPluginParameterExpressionEvaluator类的Javadoc文档。

+0

谢谢!有效。如果我不得不手动赋予“角色”的价值,那么它会是什么,我在哪里可以找到它?例如,在'MavenResourcesFiltering'中,我使用'role = org.apache.maven.shared.filtering.MavenResourcesFiltering.class' –

+1

@ChurchillNolan该角色默认为注释类型的类。例如,如果您想将某些东西注入到类型不是组件类的字段中,则需要这样做。例如:'Archiver'有多个实现,比如'JarArchiver'。如果你特别想要一个'JarArchiver',而不是其他的,那么你的字段将是'JarArchiver'类型,所以你需要告诉角色是'Archiver.class'(因为'JarArchiver'是角色'Archiver')。通常情况下,你可以使用'hint',因为你需要区分你想要注入什么类型的东西。 – Tunaki

相关问题