12

在定义 PMD 规则集时,是否可以从特定规则中排除源文件?

我想做如下的事情:

<rule ref=rulesets/java/logging-java.xml>
  <exclude name="Ignore.java" />
</rule>

规则名称似乎只支持排除。源文件有类似的东西吗?

4

5 回答 5

5

如果您使用该maven-pmd-plugin工具运行 PMD,那么您可以包含一个列出要忽略的类和规则的属性文件。

排除-pmd.properties

org.apache.maven.ClassA=UnusedPrivateField,EmptyCatchBlock
org.apache.maven.ClassB=UnusedPrivateField,UnusedFormalParameter,UnusedPrivateMethod

pom.xml

<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

于 2017-09-26T18:41:01.713 回答
4

并非没有编写自定义规则,该规则添加了按文件名排除的逻辑。

我认为在您的场景中,最好的方法是两次运行 PMD - 一次使用针对所有代码的更大规则集。还有一个针对您想要额外检查的代码的一组较小的规则。

这确实有生成两个报告的缺点。但这比您提出的问题(或创建自定义规则)更容易解决。PMD 可以生成 XML 输出。您可以通过编程方式合并这些,然后调用 PMD 的代码在最后生成 HTML 报告。或者您可以只拥有两个报告并立即完成。

于 2012-07-28T20:18:34.157 回答
1

PMD 似乎只支持排除RuleSet level.

我们有相同的要求,即排除Rule level..

最后我们自己写了一个客户wrapper lab和控制器文件遍历逻辑来解决这个问题。

但是对于正常的 PMD 任务.. 我们可以将相同的规则一起作为一个规则集,并在规则集级别将其排除。

更新:我们发现扩展net.sourceforge.pmd.lang.rule.XPathRule和添加排除文件很简单。对于Java Code Rule,我们可以使用相同的方式在规则定义中排除文件。

于 2015-02-15T02:30:06.493 回答
1

试试这个:

<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

于 2021-07-23T16:29:16.147 回答
0

是的你可以。
在您的代码/规则中,使用以下语法:

<rule ref=rulesets/java/logging-java.xml>
   <property name="violationSuppressXPath" 
      value="./ancestor::ClassOrInterfaceDeclaration[matches(@SimpleName, 'Ignore')]" />
</rule>

说明:
来自官方文档

此属性定义要使用违规节点作为上下文节点执行的 XPath 查询。如果 XPath 查询匹配任何内容,则违规将被禁止

笔记:

  1. 官方文档提供了按模式使用containsmatches排除文件的示例。
  2. 官方文档警告使用//.

注意使用 . 引用上下文节点。应避免在表达式的开头使用 //,因为它会测试文件中的所有节点,并抑制比预期更多的违规行为。

  1. 有关可以使用的 XPath 规则的更多信息,请查看此页面
于 2021-11-12T22:21:07.123 回答