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

时间:2015-01-22 10:49:11

标签: java maven maven-plugin pom.xml

请注意,我知道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

2 个答案:

答案 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中工作,我认为这不是问题。