首页 > 解决方案 > Maven 插件 - 如何为列表的每个项目配置元素

问题描述

我正在尝试在父模块中设置和强制执行代码覆盖,但允许来自子模块的覆盖。特别是 jacoco-maven-plugin 和来自子模块的规则的排除。我去过: http ://maven.apache.org/pom.html#advanced_configuration_inheritance 并尝试了各种组合选项但没有成功。

在父级中,我有一个插件定义,如下所示:

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  ...
  <configuration>
   <rules>
    <rule>
      <element>CLASS</element>
      <limits>
        <limit implementation="org.jacoco.report.check.Limit">
         <counter>LINE</counter>
         <value>COVEREDRATIO</value>
         <minimum>1.0</minimum>
        </limit>
      </limits>
    </rule>
    <rule>
      <element>BUNDLE</element>
      <limits>
        <limit implementation="org.jacoco.report.check.Limit">
         <counter>PACKAGE</counter>
         <value>COVEREDRATIO</value>
         <minimum>1.0</minimum>
        </limit>
      </limits>
    </rule> </rules> </configuration>

在子模块中,我试图避免到处复制和粘贴,但我正在努力让 maven 插件配置做我想做的事。

在我的子模块中,我想要类似的东西:

        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <configuration>
           <rules>
            <rule>
              <excludes>
                <exclude>*Application*</exclude>
                <exclude>*Config*</exclude>
              </excludes>
            </rule>
          </rules>
        </configuration>
      </plugin>

生成以下有效 pom,并将排除项添加到每个规则元素。

   <rules>
    <rule>
      <element>CLASS</element> 
      <excludes>
        <exclude>*Application*</exclude>
        <exclude>*Config*</exclude>
      </excludes>
      <limits>...</limit>
      </limits>
    </rule>
    <rule>
      <element>BUNDLE</element> 
      <excludes>
        <exclude>*Application*</exclude>
        <exclude>*Config*</exclude>
      </excludes>
      <limits>...</limits>
    </rule> </rules> </configuration>

我已经尝试了很多插件配置继承属性,但一直无法破解它。combine.self=[合并|覆盖|附加]
combine.children=[合并|覆盖|附加]

<rules combine.self="merge">
            <rule>
              <excludes combine.children="append">
                <exclude>*Application*</exclude>
                <exclude>*Config*</exclude>
              </excludes>
            </rule>
          </rules>

但生成的有效 pom 仅包含第一个规则定义,这意味着丢失 BUNDLE 规则配置

   <rules>
    <rule>
      <element>CLASS</element> 
      <excludes>
        <exclude>*Application*</exclude>
        <exclude>*Config*</exclude>
      </excludes>
      <limits>...</limit>
      </limits>
    </rule>

是否可以将 maven 配置<excludes/>为为每个子规则元素添加/追加/覆盖这个?

感谢您的任何见解!

标签: mavenmaven-3maven-plugin

解决方案


可能还有其他一些神奇的方法可以解决我完全想念的问题,但这就是我摆脱阻塞问题的方法。

高级配置继承页面仅提及 combine.childrencombine.self但阅读 POM.xsd 时提及 https://codehaus-plexus.github.io/plexus-utils/apidocs/org/codehaus/plexus/util/xml/Xpp3DomUtils.html

在深入研究此页面的文档时,我偶然发现了两个额外的选项 combine.idcombine.keys 我很感激有一些测试为这些属性的工作方式提供了参考。

在我的父 pom 中,我已经使用这些combine.id属性定义了插件配置。

  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  ...
  <configuration>
<rules combine.id="jacoco-rules" combine.children="merge">
              <rule combine.id="class-rule"  combine.children="merge">
                <element>CLASS</element>
                <excludes combine.id="class-rule-excludes" combine.children="merge">
                  <exclude>META-INF/**</exclude>
                </excludes>
                <limits>
                  ...
                </limits>
              </rule>
              <rule combine.id="bundle-rule" >
                <element>BUNDLE</element>
                <excludes combine.id="bundle-rule-excludes" combine.children="merge">
                  <exclude>META-INF/**</exclude>
                </excludes>
                <limits>...

这使我可以在我的孩子 poms 中添加现有规则来引用这个combine.id,我的工作解决方案现在看起来像

        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
          <rules combine.id="jacoco-rules" combine.children="merge">
            <rule combine.id="class-rule" combine.children="merge">
              <excludes combine.children="append">
                <exclude>*Application*</exclude>
                <exclude>*Config*</exclude>
              </excludes>
            </rule>
            <rule combine.id="bundle-rule"></rule>
          </rules>
        </configuration>
      </plugin>

有效的 pom 现在看起来像我期望的那样,同时存在并配置了 CLASS 和 BUNDLE 规则,但只有 CLASS 具有 excludes 元素。

有效的 pom

                <rule combine.id="class-rule" combine.children="merge">
                  <!--This is the element I was trying to add to this plugin configuration -->
                  <excludes combine.id="class-rule-excludes" combine.children="append">
                    <exclude>*Application*</exclude>
                    <exclude>*Config*</exclude>
                  </excludes>
                  <element>CLASS</element>
                  <limits>...
                  </limits>
                </rule>
                <rule combine.id="bundle-rule">
                  <element>BUNDLE</element>
    <!-- no child plugin changes -->

注意:我很确定所有combine.children="merge"属性都是多余的,并且这些属性在您的 maven 版本combine.idcombine.keys可能不可用。

高温高压


推荐阅读