【问题标题】:Java Maven MOJO - getting information from project POMJava Maven MOJO - 从项目 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 等,看看它们是如何工作的等等。
  • 感谢您的提示

标签: java maven pom.xml mojo


【解决方案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>

【讨论】:

【解决方案2】:
@Component
private MavenProject project;

如果使用新的maven-plugin-annotations 也可以工作(更简洁直观),这是从maven-archetype-plugin 创建的新mojos 的默认设置。

编辑(感谢@bmargulies):虽然@Component Javadoc 3.2 建议将它用于MavenProject,但显然不推荐使用,并且从3.3 开始放弃该建议; maven-plugin-tools-annotationsidiom 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>

(感谢已经提供此信息的其他人。此答案将它们组合在一个地方。)

【讨论】:

【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2017-11-24
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多