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 中获取信息的主要内容,如果未能解决你的问题,请参考以下文章

将价值从 Mojo 传递到 pom

Maven:我的 mojo 如何访问自己的资源?

未能执行目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java

目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java 的参数“mainClass”丢失或无效

Maven pom项目部署

在 Maven 中从测试范围运行 main:“目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java 的参数 'mainClass' 丢失或无效”