maven - 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/>
为为每个子规则元素添加/追加/覆盖这个?
感谢您的任何见解!
解决方案
可能还有其他一些神奇的方法可以解决我完全想念的问题,但这就是我摆脱阻塞问题的方法。
高级配置继承页面仅提及
combine.children
或combine.self
但阅读 POM.xsd 时提及
https://codehaus-plexus.github.io/plexus-utils/apidocs/org/codehaus/plexus/util/xml/Xpp3DomUtils.html
在深入研究此页面的文档时,我偶然发现了两个额外的选项
combine.id
,combine.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.id
中combine.keys
可能不可用。
高温高压
推荐阅读
- php - 从php中的字符串中删除字母数字单词
- javascript - 使用猫鼬的对象引用
- php - Slim Framework如何在拦截器中按名称捕获路由参数
- c# - 在 Web API (.Net Framework) 中创建自定义 AuthorizeAttribute
- reactjs - 使用 redux,当状态树中的状态有效更改时,为什么 mapStateToProps() 没有在 props 中显示状态?
- javascript - 刷新页面和重定向到页面的区别
- angular - 如何在 Angular 5 中使用服务中的组件方法?
- python - 如何在 Python API 调用中从 PostgreSQL 触发器传递值?
- promise - 从 Fetch API 返回正文文本
- php - PHP CodeIgniter:致命错误:调用未定义函数 form_open()