maven - PMD maven 插件:如何为测试指定不同的规则集?
问题描述
我需要配置 PMD maven 插件来扫描测试源代码,与生产代码相比,检查不那么严格。
有没有办法做到这一点?
解决方案
您可能需要为插件配置两个单独的执行。这允许您使用不同的配置。一次执行只检查生产代码(<includeTests>false</includeTests>
),另一个只检查测试代码(<includeTests>true</includeTests>
和<excludeRoots><excludeRoot>${basedir}/src/main/java</excludeRoot></excludeRoots>
)。
如果您分享您的解决方案,我们可以将其作为示例添加到https://maven.apache.org/plugins/maven-pmd-plugin/
另一种方法是对所有代码使用相同的代码质量规则,避免做出妥协,因为它“只是测试代码”。虽然测试代码不在生产中运行,但它用于测试生产代码,因此如果您使用不太严格的检查,您可能会将测试代码视为最薄弱的环节......
这是此场景的完整插件配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.14.0</version>
<configuration>
<includeTests>false</includeTests>
<rulesets>
<ruleset>config/pmd/pmdMain.xml</ruleset>
</rulesets>
<linkXRef>false</linkXRef>
</configuration>
<executions>
<execution>
<id>pmd-main</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
<execution>
<id>pmd-test</id>
<phase>verify</phase>
<goals>
<goal>pmd</goal>
<goal>check</goal>
</goals>
<configuration>
<targetDirectory>${project.build.directory}/pmdTest/</targetDirectory>
<includeTests>true</includeTests>
<excludeRoots>
<excludeRoot>${basedir}/src/main/java</excludeRoot>
</excludeRoots>
<rulesets>
<ruleset>config/pmd/pmdTest.xml</ruleset>
</rulesets>
</configuration>
</execution>
<execution>
<id>cpd</id>
<phase>verify</phase>
<goals>
<goal>cpd-check</goal>
</goals>
</execution>
</executions>
</plugin>
它在config/pmd/pmdMain.xml
没有测试的情况下使用主代码的规则集。这是直接在插件级别配置的。规则集config/pmd/pmdTest.xml
仅用于测试代码。这是在执行中配置的 id pmd-test
。
但它有一个缺点:PMD 运行了 3 次.... 两次用于主代码,一次用于测试代码。原因是“pmd:check”会自动触发“pmd:pmd”,但它只使用标准配置(例如忽略生命周期/执行ID)。
执行“pmd-test”为测试代码(创建 target/pmdTest/pmd.xml)调用一次“pmd:pmd”,然后调用 pmd:check——它本身调用 pmd:pmd 并使用默认配置——然后实际运行 pmd:check,它使用执行配置并使用 target/pmdTest/pmd.xml 来决定是否构建失败。
推荐阅读
- javascript - 显示不同的图像并在单击后禁用链接?(Javascript/Ajax)
- python - Pygame 运动的标志和字符与墙壁
- c - 从 IDE 运行 Wine 程序所需的构建命令
- javascript - 在 javascript 数组中添加属性 - 值
- regex - 正则表达式以 3 个连续的大写字母开头
- python - KeyError: 'APP1' 使用 exif 读取元数据时
- django - Django 没有使用 SQLite 为外键创建数据库约束
- python - 删除字符串的特定部分
- email - 是否可以为移动设备指定 MIME 内容类型?
- python - 为什么即使答案是正确的,while 循环也不会在这个函数中中断?