【问题标题】:Best way to access the runtime configuration of a maven plugin from a custom mojo?从自定义 mojo 访问 maven 插件的运行时配置的最佳方式?
【发布时间】:2008-09-24 04:13:50
【问题描述】:

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

最好的方法是什么?

【问题讨论】:

    标签: maven-2 maven-plugin


    【解决方案1】:

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

    首先您需要让 Maven 将当前项目注入到您的 mojo 中,您可以使用下面定义的类变量来获取它。

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

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

    mavenProject.getBuildPlugins()
    

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

    最后,你可以得到一个 Xpp3Dom 的配置。

    plugin.getConfiguration()
    

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

    【讨论】:

    • 这与我上面的解决方案有何不同?另外,getBuildPlugins 是只返回 pom.xml 的 部分中定义的插件,还是所有插件,甚至是配置文件等中定义的插件?
    • 使用 getBuildPlugins() 只会返回 pom.xml 的 部分中的插件和活动配置文件的 部分中定义的插件。
    • @Kingamajick 我是否必须以某种方式刷新更改的更改?我已更改插件依赖项(在此插件执行期间),但看不到预期结果
    【解决方案2】:

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

    这适用于我测试过的几个小型构建。包括多模块构建。

    【讨论】:

      【解决方案3】:

      我不确定您将如何做到这一点,但在我看来,这可能不是最好的设计决策。如果可能的话,您应该致力于将您的 Mojo 与任何其他插件分离。

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

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

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

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

      <somePluginProperty>${foo}</somePluginProperty>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多