Maven 插件 - 如何为列表的每个项目配置元素

Maven plugin - How to configure element for each item of a list

我正在尝试在父模块中设置和实施代码覆盖,但允许从子模块进行覆盖。特别是 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>

生成以下 effective-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>

但是生成的effective-pom只包含第一个规则定义和这意味着丢失BUNDLE规则配置

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

是否可以为每个子规则元素将 Maven 配置为 ADD/APPEND/OVERRIDE 这个 <excludes/>

感谢您的任何见解!

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

高级配置继承页面只提到 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>...

这允许我添加到我的子 pom 中引用此 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>

effective-pom 现在看起来和我期望的一样,同时存在和配置了 CLASS 和 BUNDLE 规则,但只有 CLASS 具有排除元素。

有效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" 属性都是多余的,并且这些 combine.idcombine.keys 可能在您的 maven 版本中不可用。

HTH