Maven 2 Maven:如何在mojo之间传递参数?

Maven 2 Maven:如何在mojo之间传递参数?,maven-2,maven-plugin,Maven 2,Maven Plugin,如何编程一个Mojo来设置另一个Mojo的配置?例如:Mojo A需要定义配置参数A.foo。用户可以手动指定A.foo,或者运行插件B来计算他/她的值。我想maven的方法是在第一个Mojo中设置一个属性,然后从另一个Mojo访问它。回答我自己的问题: 可以使用MavenProject实例在运行时访问插件的配置或项目范围的属性: /** * The maven project. * * @parameter expression="${project}" * @readonly *

如何编程一个Mojo来设置另一个Mojo的配置?例如:Mojo A需要定义配置参数
A.foo
。用户可以手动指定
A.foo
,或者运行插件B来计算他/她的值。

我想maven的方法是在第一个Mojo中设置一个属性,然后从另一个Mojo访问它。

回答我自己的问题:

可以使用
MavenProject
实例在运行时访问插件的配置或项目范围的属性:

/**
 * The maven project.
 * 
 * @parameter expression="${project}"
 * @readonly
 */
 private MavenProject project;
然后,您可以在运行时访问插件的配置:

private Plugin lookupPlugin(String key)
{
    List plugins = getProject().getBuildPlugins();

    for (Iterator iterator = plugins.iterator(); iterator.hasNext();)
    {
        Plugin plugin = (Plugin) iterator.next();
        if(key.equalsIgnoreCase(plugin.getKey()))
            return plugin;
    }
    return null;
}

...
Xpp3Dom configuration = (Xpp3Dom) Plugin.getConfiguration()
configuration.getChild("parameterName"); // get parameter
configuration.addChild(new Xpp3Dom("parameterName")); // add parameter
...
注意:在当前阶段结束时,将放弃任何配置更改

资料来源:


或者,您可以使用
MavenProject.getProperties()

获取/设置项目范围内的参数。事实证明,这是一件棘手的事情,主要是因为Maven运行时对插件进行“配置”的计时。从getBuildPlugins更改“配置”通常是行不通的

如果您正在编写目标插件,最好的方法是默认值,否则使用属性

使用属性,但必须注意如何使用属性。需要注意的是,如果您的POM(或任何父级)为属性定义了一个值,那么${property}引用将在加载POM时被替换。但是,如果没有“property”属性,则${property}引用将保持不变,并且仅在最后可能的时刻用空值替换

“默认值”也会在最后一个可能的时刻进行评估,我认为这是一个更安全的解决方案,因为在最后一个可能的时刻必须对其进行评估是有逻辑的,因为不存在的属性可能只是一个实现细节,在Maven的未来版本中可能会发生更改

在我的例子中,我不得不求助于属性,因为我想控制surefire插件的“classesDirectory”。当Cobertura未运行时,我希望它继续默认为${project.build.outputDirectory},但当Cobertura运行时,我希望它使用${project.build.outputDirectory}/generated classes/Cobertura

在插件部分中定义:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>${maven-surefire-plugin.version}</version>
 <configuration>
  <classesDirectory>${instrumentedClassesDirectory}</classesDirectory>
 </configuration>
</plugin>
并确保在任何情况下均不得在任何POM中放置以下内容:

<properties>
  <instrumentedClassesDirectory>${project.build.outputDirectory}</instrumentedClassesDirectory>
</properties>

${project.build.outputDirectory}

因为如果这样做,即使属性的值是由源插件设置的,目标插件也不会看到该值。如果您使用的属性被传递到源插件的默认值中,那么您可以忽略最后一个警告,但正如我在本例中所说的那样,这不起作用,因为我不想更改project.build.outputDirectory的值。

虽然这是最强大的方法(+1),但我建议使用pascal建议的标准maven方法(也是+1)。如果您在使用此解决方案时遇到任何问题,请参阅答案。嗨,这真的可以用于在Mojo之间传递信息吗?我通过修改Mojo中目标Mojo的配置来尝试这个解决方案。它在执行时(在同一阶段)永远无法获得添加的配置。@rezakasiyauqi,它在过去对我有效。除此之外,我不知道。如果这对你有用,如果mojo处于不同的阶段,那么这听起来确实是一个限制。尝试针对Maven或使用提交一个bug。测试表明这不起作用。在任何插件执行之前(我认为这是在创建有效POM时),类似这样的属性替换被解析为它们的文本值。如果您试图与之通信的插件为其参数定义了一个“表达式”,则会起作用,因为对这些参数的计算会进一步延迟。。但是,对于您在一个POM的配置部分中放入POM的某些内容,在运行另一个插件时进行修改已经太晚了。
<properties>
  <instrumentedClassesDirectory>${project.build.outputDirectory}</instrumentedClassesDirectory>
</properties>