【问题标题】:Maven plugin - How to configure element for each item of a listMaven 插件 - 如何为列表的每个项目配置元素
【发布时间】:2021-05-11 23:04:01
【问题描述】:

我正在尝试在父模块中设置和强制执行代码覆盖,但允许来自子模块的覆盖。特别是 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 配置为为每个子规则元素添加/追加/覆盖此 &lt;excludes/&gt;

感谢您的任何见解!

【问题讨论】:

    标签: maven maven-3 maven-plugin


    【解决方案1】:

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

    高级配置继承的页面只提到 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" 属性都是多余的,并且这些 combine.idcombine.keys 在您的 maven 版本中可能不可用。

    HTH

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2011-09-03
      • 2013-11-10
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多