pmd maven 插件不尊重 exclude-cpd.properties

pmd maven plugin does not respect exclude-cpd.properties

我有多个模块的maven项目,结构是这样的:

/myProject 
  pom.xml
  exclude-cpd.properties
  -- module1
     pom.xml
     exclude-cpd.properties
  -- module2
     pom.xml
     exclude-cpd.properties

在我的 parent pom.xml 我添加了 pmd 插件:

<build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-pmd-plugin</artifactId>
                    <version>3.12.0</version>
                    <configuration>
                        <rulesets>
                            <ruleset>pmd_ruleset.xml</ruleset>
                        </rulesets>
                        <minimumTokens>80</minimumTokens>
                        <includeTests>true</includeTests>
                        <excludeFromFailureFile>exclude-cpd.properties</excludeFromFailureFile>
                        <printFailingErrors>true</printFailingErrors>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

并且在 exclude-cpd.properties 中我包括了我想从 cpd-check 中排除的所有文件作为逗号分隔的字符串。

但正如我运行 mvn clean compile,它仍然扫描那些被排除的文件并抱怨重复。似乎 excludeFromFailureFile 根本不起作用,我最终不得不使用 excludes 从 pmd 检查和 cpd 检查中排除文件,但这并不理想。有人知道如何让 excludeFromFailureFile 工作吗?

工作pom.xml:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.12.0</version>
                <configuration>
                    <rulesets>
                        <ruleset>pmd_ruleset.xml</ruleset>
                    </rulesets>
                    <minimumTokens>80</minimumTokens>
                    <includeTests>true</includeTests>
                    <excludes>
                        <exclude>**/XyzService*.java</exclude>
                    </excludes>
                    <printFailingErrors>true</printFailingErrors>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

我认为你误解了标志。

excludeFromFailureFile 的字面意思是:如果在这些文件上报告了违规,请不要使构建失败。文件仍然会被分析,但如果只有这些文件没有其他文件有违规,构建仍然会通过(如果其他文件有违规,构建仍然会失败)。这甚至不是 PMD 功能,而是 Maven 插件内置的功能。

这不是 "exclude from analysis",要做到这一点,您需要使用第二个示例中使用的 excludes 配置。

另一个好主意是使用 @SuppressWarnings("CPD-START") 和 @SuppressWarnings("CPD-END") 忽略 CPD 这两个注释中的所有 java 代码,例如:

...

//enable suppression (start)
@SuppressWarnings("CPD-START")
public Object shouldBeIgnoredFromHere(String any) throws Exception {
    // any code here will be ignored for the duplication detection
}

...

//disable suppression (end)
@SuppressWarnings("CPD-END)
public void shouldBeIgnoredToHere() {
}

...

阅读抑制章节:https://pmd.sourceforge.io/pmd-5.0.5/cpd-usage.html