在定义 PMD 规则集时,是否可以从特定规则中排除源文件?
我想做如下的事情:
<rule ref=rulesets/java/logging-java.xml>
<exclude name="Ignore.java" />
</rule>
规则名称似乎只支持排除。源文件有类似的东西吗?
如果您使用该maven-pmd-plugin
工具运行 PMD,那么您可以包含一个列出要忽略的类和规则的属性文件。
org.apache.maven.ClassA=UnusedPrivateField,EmptyCatchBlock
org.apache.maven.ClassB=UnusedPrivateField,UnusedFormalParameter,UnusedPrivateMethod
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.8</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<configuration>
<excludeFromFailureFile>exclude-pmd.properties</excludeFromFailureFile>
</configuration>
</execution>
<execution>
<goals>
<goal>cpd-check</goal>
</goals>
<configuration>
<excludeFromFailureFile>exclude-cpd.properties</excludeFromFailureFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
更多详细信息:https ://maven.apache.org/plugins/maven-pmd-plugin/examples/violation-exclusions.html
并非没有编写自定义规则,该规则添加了按文件名排除的逻辑。
我认为在您的场景中,最好的方法是两次运行 PMD - 一次使用针对所有代码的更大规则集。还有一个针对您想要额外检查的代码的一组较小的规则。
这确实有生成两个报告的缺点。但这比您提出的问题(或创建自定义规则)更容易解决。PMD 可以生成 XML 输出。您可以通过编程方式合并这些,然后调用 PMD 的代码在最后生成 HTML 报告。或者您可以只拥有两个报告并立即完成。
PMD 似乎只支持排除RuleSet level
.
我们有相同的要求,即排除Rule level
..
最后我们自己写了一个客户wrapper lab
和控制器文件遍历逻辑来解决这个问题。
但是对于正常的 PMD 任务.. 我们可以将相同的规则一起作为一个规则集,并在规则集级别将其排除。
更新:我们发现扩展net.sourceforge.pmd.lang.rule.XPathRule
和添加排除文件很简单。对于Java Code Rule
,我们可以使用相同的方式在规则定义中排除文件。
试试这个:
<rule ref="category/java/bestpractices.xml/UnusedPrivateField">
<properties>
<!--Ignore UnusedPrivateField on classes where the class name ends with DTO-->
<property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration['.*DTO']"/>
</properties>
</rule>
您还可以排除文件夹。例如,您要排除具有“样本”名称的文件夹,在这种情况下,值将类似于:
value="//ClassOrInterfaceDeclaration['.*/sample/.*']"
有关更多详细信息,请在此处查看https://github.com/pmd/pmd/issues/1142
是的你可以。
在您的代码/规则中,使用以下语法:
<rule ref=rulesets/java/logging-java.xml>
<property name="violationSuppressXPath"
value="./ancestor::ClassOrInterfaceDeclaration[matches(@SimpleName, 'Ignore')]" />
</rule>
说明:
来自官方文档:
此属性定义要使用违规节点作为上下文节点执行的 XPath 查询。如果 XPath 查询匹配任何内容,则违规将被禁止
笔记:
contains
和matches
排除文件的示例。//
.注意使用 . 引用上下文节点。应避免在表达式的开头使用 //,因为它会测试文件中的所有节点,并抑制比预期更多的违规行为。