我正在写一个自定义的Maven2 MOJO。 我需要访问另外一个插件的运行时配置,从这个MOJO。
做这个的最好方式是什么?
我正在写一个自定义的Maven2 MOJO。 我需要访问另外一个插件的运行时配置,从这个MOJO。
做这个的最好方式是什么?
你可以得到目前已经在使用以下步骤构建使用插件的列表:
首先,你需要得到的Maven到当前项目注入到你的魔力,可以使用下面定义的类变量得到这个。
/**
* The maven project.
*
* @parameter expression="${project}"
* @readonly
*/
private MavenProject project;
然后你可以使用下面的方法得到这个版本使用的插件列表。
mavenProject.getBuildPlugins()
可以遍历虽然这列表,直到找到您要提取配置的插件。
最后,你可以配置为Xpp3Dom。
plugin.getConfiguration()
注意:如果你改变了其他插件的配置(而不仅仅是提取信息),它只会继续改变当前不相及后续阶段。
使用属性肯定是一条路可走,但效果并不理想。 它仍然需要用户来定义整个POM多个地方$ {propertyName的}。 我想,让我的插件没有修改用户的POM,比插件定义本身的其他工作。
我没有看到访问另一个MOJO的运行时性能过于紧密耦合。 如果其他MOJO在构建层次结构定义的任何地方,我想我的MOJO尊重相同的配置。
我目前的解决办法是:
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;
}
/**
* Extracts nested values from the given config object into a List.
*
* @param childname the name of the first subelement that contains the list
* @param config the actual config object
*/
private List extractNestedStrings(String childname, Xpp3Dom config) {
final Xpp3Dom subelement = config.getChild(childname);
if (subelement != null) {
List result = new LinkedList();
final Xpp3Dom[] children = subelement.getChildren();
for (int i = 0; i < children.length; i++) {
final Xpp3Dom child = children[i];
result.add(child.getValue());
}
getLog().info("Extracted strings: " + result);
return result;
}
return null;
}
这已经工作了几个小建立我已经与测试。 包括多模块的构建。
我不知道你会怎么做,完全是,但在我看来,这可能不是最好的设计决策。 如果可能的话,你的目标应该是从任何其他插件解耦的Mojo在那里。
相反,我会建议使用自定义属性分解出单独的插件的配置的任何重复。
您可以通过使用属性部分设置在你的POM中自定义属性“foo”的:
<project>
...
<properties>
<foo>value</foo>
</properties>
...
</project>
该物业foo是现在任何地方访问POM中使用美元符号+大括号表示法:
<somePluginProperty>${foo}</somePluginProperty>