您可以排除特定PMD规则的源文件吗?

时间:2012-07-25 08:17:08

标签: java pmd

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

我想做以下事情:

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

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

4 个答案:

答案 0 :(得分:4)

编写自定义规则,添加逻辑以便按文件名排除。

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

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

答案 1 :(得分:2)

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

exclude-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

答案 2 :(得分:1)

似乎PMD仅支持RuleSet level中的排除文件。

我们要求排除Rule level ..

中的文件

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

但是对于正常的PMD任务..我们可以将规则相同的规则组合在一起,并在ruleSet级别中将其排除。

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

答案 3 :(得分: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>

您还可以排除文件夹。例如,您要排除具有“sample”名称的文件夹,在这种情况下,值将类似于:

value="//ClassOrInterfaceDeclaration['.*/sample/.*']"

有关详细信息,请查看此处https://github.com/pmd/pmd/issues/1142