我正在开发一个 Maven 插件。我似乎很难弄清楚,从执行 MOJO 的项目中获取 POM 信息的好方法是什么?
例如,如果我在另一个 maven 项目中执行我的 mojo,我想获取项目名称或其他一些参数。
还有一件事,AbstractMojo.java 类中有一个上下文 MAP 有私有 Map pluginContext,如果我错了,有人可以纠正我,但这应该用于在 mojos 之间传递信息吗?
您可以使用如下声明的字段将当前 maven 项目注入您的 mojo:
/**
* @parameter default-value="${project}"
* @required
* @readonly
*/
MavenProject project;
然后只需调用即可获得项目名称project.getName()
。要使用此 API,您需要将maven-project
工件添加为依赖项:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.0.6</version>
</dependency>
@Component
private MavenProject project;
如果使用 new 也可以工作(更简洁和直观)maven-plugin-annotations
,这是从maven-archetype-plugin
.
编辑(感谢@bmargulies):虽然@Component
3.2 的Javadoc 建议将它用于MavenProject
,但显然已弃用,并且从3.3 开始放弃该建议;(从 3.3 开始)建议的成语maven-plugin-tools-annotations
是这样的(两者似乎都有效):
@Parameter(defaultValue="${project}", readonly=true, required=true)
private MavenProject project;
现在首选的语法是:
@Parameter(defaultValue = "${project}", required = true, readonly = true)
MavenProject project;
您必须为maven-project
插件的 pom 添加依赖项:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.0.6</version>
</dependency>
(感谢已经提供此信息的其他人。此答案将它们组合在一个地方。)
请参阅教程:如何创建 Maven 插件:
<dependency>
<!-- needed when injecting the Maven Project into a plugin -->
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.6.3</version>
<scope>provided</scope>
</dependency>
@Parameter(property = "project", readonly = true)
private MavenProject project;
maven-project
对于 maven 2.x 版本已替换为maven-model
maven 3.x 版本,因此对于新项目,请使用
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.6.3</version>
</dependency>