我正在编写一个自定义的 maven2 MOJO。我需要从这个 MOJO 访问另一个插件的运行时配置。
做这个的最好方式是什么?
您可以使用以下步骤获取当前在构建中使用的插件列表:
首先,您需要让 Maven 将当前项目注入到您的 mojo 中,您使用下面定义的类变量来获取它。
/**
* The maven project.
*
* @parameter expression="${project}"
* @readonly
*/
private MavenProject project;
然后,您可以使用以下内容获取此构建中使用的插件列表。
mavenProject.getBuildPlugins()
您可以遍历此列表,直到找到要从中提取配置的插件。
最后,您可以获得配置为 Xpp3Dom。
plugin.getConfiguration()
注意:如果您更改其他插件配置(而不仅仅是提取信息),它只会在当前阶段而不是后续阶段保持更改。
使用属性当然是一种方法,但并不理想。它仍然需要用户在整个 pom.xml 中的多个位置定义 ${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>
现在可以使用美元符号 + 花括号符号在 pom 中的任何位置访问属性 foo:
<somePluginProperty>${foo}</somePluginProperty>