从自定义Mojo访问Maven插件的运行时配置的最佳方法?
时间:2020-03-06 14:38:31 来源:igfitidea点击:
我正在编写一个自定义的maven2 MOJO。我需要从此MOJO访问另一个插件的运行时配置。
做这个的最好方式是什么?
解决方案
我不确定我们将如何准确地做到这一点,但是在我看来,这可能不是最佳的设计决策。如果可能的话,我们应该致力于将Mojo与其他任何插件分离开来。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
相反,我建议使用自定义属性来排除单独插件配置中的所有重复项。
我们可以使用"属性"部分在pom中设置自定义属性" foo":
<project> ... <properties> <foo>value</foo> </properties> ... </project>
现在可以使用美元符号+大括号表示法在pom中的任何位置访问foo属性:
<somePluginProperty>${foo}</somePluginProperty>
使用属性当然是一种方法,但是并不理想。仍然需要用户在整个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; }
这已经为我测试过的一些小版本提供了帮助。包括一个多模块的构建。
我们可以使用以下步骤获取当前在构建中使用的插件列表:
首先,我们需要使Maven将当前项目注入到mojo中,使用下面定义的类变量来实现这一点。
/** * The maven project. * * @parameter expression="${project}" * @readonly */ private MavenProject project;
然后,我们可以使用以下内容获取此构建中使用的插件列表。
mavenProject.getBuildPlugins()
我们可以遍历此列表,直到找到要从中提取配置的插件。
最后,我们可以将配置获取为Xpp3Dom。
plugin.getConfiguration()
注意:如果我们更改其他插件的配置(而不仅仅是提取信息),它将仅在当前阶段而不是后续阶段保持更改。