在 Maven3 而不是 Maven2 中使用插件时 MavenProject 参数导致错误

MavenProject parameter leads to error when using plugin in Maven3 instead of Maven2

请注意,我知道 Maven2 已停产,但我对生产方面的选择一无所知,所以请不要再告诉我切换到 Maven3,因为这是不以任何方式回答这个问题。

现在我们公司使用的是Maven2,但是由于某些原因,我们的一些组件需要我们使用Maven3。

我正在处理的插件被所有组件使用(通过在父 pom 中)并且在 运行 与 Maven3 组件一起使用时给出错误。

[ERROR] Failed to execute goal XXXX on project YYY: Unable to parse
configuration of mojo XXX for parameter project: Cannot find 'project' in class X. 

"project" 声明为:

/**
 * The Maven project.
 *
 * @since 2.0.2
 * @parameter expression="${project}"
 * @required
 * @readonly
 */
private static MavenProject project;

并如此使用(在 Execute() 中):

LOGGER.info("==> Running XXX plugin for projet='{}'.",
            project.getArtifactId());

它在 Maven2 中运行得非常棒

据我了解,对象的实例项目没有参数"MavenProject"。

问题是为什么表达式在 Maven2 的 pom 中获得了正确的信息,但在 Maven3 中却不再是?

为了添加更多信息并更加准确,这里是从 super pom 继承的配置文件:

<profile>
        <id>profileID</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.XXX</groupId>
                    <artifactId>maven-XXX-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>test-compile</phase>
                            <goals>
                                <goal>modelmanager</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

对我来说,这不是任何问题的根源,因为这里只提供了阶段和目标,但我仍然提供它是为了更好地理解。

如果这有帮助,则没有在 pom 中为 maven 插件指定版本 "plugin"。

执行是这样完成的: mvn [clean] [a phase] -PprofileID

您的方法有两个问题。首先,您使用的 static 在任何情况下都是错误的。此外,您应该更改为 Java 5 annotations 而不是旧的 xdoclet 方式,您可以像下面那样进行操作。

@Parameter (defaultValue = "${project}", required=true, readonly = true)
private MavenProject project;

了解可以定义哪些值可以在 evaluation reference.

中找到

如果你这样做正确,插件将适用于 Maven 2 和 Maven 3。 除此之外,Maven 2 已经被定义 End Of Life 并且 Maven 3 已经存在了很长时间(自 2010 年以来!)。

你应该知道 plugin tools 可以在那里支持你。

错误来自:

 private static MavenProject project;

去除静电并保持其他一切不变解决了问题

所以,他们似乎改变了 Mojos 在 Maven3 中的工作方式,并且该属性是静态的,由于某种原因它没有获得任何价值。

也许可以通过查看 JVM 内部结构的工作原理得到一些答案:http://blog.jamesdbloom.com/JVMInternals.html#classloader

在 Maven 开始解析注释之前,静态字段可能已经声明(并且未初始化)。

话虽这么说,但我不知道为什么首先要对该字段进行静态声明,所以因为它在 Maven2 中工作,所以我认为这不是问题所在。