在 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 中工作,所以我认为这不是问题所在。
请注意,我知道 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 中工作,所以我认为这不是问题所在。