从自定义mojo访问maven插件的运行时配置的最佳方法?

时间:2008-09-24 04:13:50

标签: maven-2 maven-plugin

我正在写一个自定义的maven2 MOJO。我需要从这个MOJO访问另一个插件的运行时配置。

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

您可以使用以下步骤获取当前在构建中使用的插件列表:

首先,你需要让Maven将当前项目注入你的mojo,你使用下面定义的类变量来获得它。

/**
 * The maven project.
 * 
 * @parameter expression="${project}"
 * @readonly
 */
 private MavenProject project;

然后,您可以使用以下内容获取此版本中使用的插件列表。

mavenProject.getBuildPlugins()

您可以迭代此列表,直到找到要从中提取配置的插件。

最后,您可以将配置作为Xpp3Dom。

plugin.getConfiguration()

注意:如果您更改其他插件配置(而不仅仅是提取信息),它将仅针对当前阶段而不是后续阶段进行更改。

答案 1 :(得分:3)

使用属性当然是一种方法,但并不理想。它仍然需要用户在整个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;
}

这适用于我测试过的少数小型版本。包括多模块构建。

答案 2 :(得分:0)

我不确定你会怎么做,但在我看来,这可能不是最好的设计决定。如果可能的话,你应该把你的Mojo与任何其他插件分开。

相反,我建议使用自定义属性来分解单独插件配置中的任何重复。

您可以使用属性部分在您的pom中设置自定义属性“foo”:

<project>
  ...
  <properties>
    <foo>value</foo>
  </properties>
  ...
</project>

现在可以使用美元符号+大括号表示法在pom中的任何位置访问属性foo:

<somePluginProperty>${foo}</somePluginProperty>