Java Maven MOJO - 从项目 POM 中获取信息
Posted
技术标签:
【中文标题】Java Maven MOJO - 从项目 POM 中获取信息【英文标题】:Java Maven MOJO - getting information from project POM 【发布时间】:2012-05-23 07:01:42 【问题描述】:我正在开发一个 Maven 插件。我似乎很难弄清楚,从执行 MOJO 的项目中获取 POM 信息的好方法是什么?
例如,如果我在另一个 maven 项目中执行我的 mojo,我想获取项目名称或其他一些参数。
还有一件事,AbstractMojo.java 类中有一个上下文 MAP,有一个私有 Map pluginContext,如果我错了,有人可以纠正我,但这应该用于在 mojos 之间传递信息?
【问题讨论】:
您应该清楚地指定您想要什么以及您需要在哪里访问此信息。项目信息默认在pom中可见 在创建插件时我总是问的第一个问题是:你想实现什么?你确定你需要写一个插件吗?此外,看看其他插件,例如 maven-assembly-plugin、maven-javadoc-plugin 等,看看它们是如何工作的等等。 感谢您的提示 【参考方案1】:您可以使用如下声明的字段将当前 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>
【讨论】:
在 maven 3.0.3 中为我工作;添加依赖然后注入项目! 我想我在网上的其他地方找到了这个答案,但对它是通过添加以前未知的(到我的项目)依赖项来注入的事实感到困惑。这完美地清除了它,谢谢。 根据Tutorial: How to Create a Maven Plugin 是:maven-core
:“将 Maven 项目注入插件时需要”(显然是 since 2013。latest version of a:maven-project
is from 2010)。还有the annotation is different, too.【参考方案2】:
@Component
private MavenProject project;
如果使用新的maven-plugin-annotations
也可以工作(更简洁直观),这是从maven-archetype-plugin
创建的新mojos 的默认设置。
编辑(感谢@bmargulies):虽然@Component
Javadoc 3.2 建议将它用于MavenProject
,但显然不推荐使用,并且从3.3 开始放弃该建议; maven-plugin-tools-annotations
的 idiom suggested(从 3.3 开始)是这样的(两者似乎都有效):
@Parameter(defaultValue="$project", readonly=true, required=true)
private MavenProject project;
【讨论】:
好的;推荐什么(对于使用新 API 的插件)?【参考方案3】:现在首选的语法是:
@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>
(感谢已经提供此信息的其他人。此答案将它们组合在一个地方。)
【讨论】:
也许你想为 @Parameter 注释添加 maven-plugin-annotations 工件。 根据Tutorial: How to Create a Maven Plugin,它是:maven-core
:“将 Maven 项目注入插件时需要”(显然已经since 2013。latest version of a:maven-project
is from 2010 )。还有the annotation is different, too.【参考方案4】:
maven 2.x 版本的maven-project
已替换为 maven 3.x 版本的maven-model
,因此对于新项目,请使用
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.6.3</version>
</dependency>
【讨论】:
用这个代替a:maven-core
: „MavenProject 不能被解析为一个类型“【参考方案5】:
见Tutorial: How to Create a Maven Plugin:
POM
<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;
【讨论】:
以上是关于Java Maven MOJO - 从项目 POM 中获取信息的主要内容,如果未能解决你的问题,请参考以下文章
未能执行目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java
目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java 的参数“mainClass”丢失或无效
在 Maven 中从测试范围运行 main:“目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java 的参数 'mainClass' 丢失或无效”