请注意,我知道Maven2是EOL,但我对生产方面做出的选择一无所知,所以请不要再告诉我切换到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.
“项目”被声明为:
/**
* 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插件“插件”指定版本。
执行如下:
mvn [clean] [a phase] -PprofileID
答案 0 :(得分:1)
您的方法存在两个问题。首先你使用的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。
答案 1 :(得分:0)
错误来自:
private static MavenProject project;
删除静态并保持其他所有内容不受影响修复了问题
所以,似乎他们改变了Mojos在Maven3中的工作方式,并且该属性是静态的,由于某种原因它没有得到任何价值。
通过查看JVM内部的工作原理,可能会有一些答案:http://blog.jamesdbloom.com/JVMInternals.html#classloader
在Maven开始解析注释之前,可能已声明(并且未初始化)静态字段。
话虽这么说,我不知道为什么首先有一个静态声明字段,所以因为它在Maven2中工作,我认为这不是问题。