maven-pmd-plugin

时间:2017-07-25 19:05:29

标签: maven pmd

我正在使用内置规则集strings.xmlunusedcode.xml

<?xml version="1.0"?>
<ruleset name="Custom ruleset"
        xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
    <description>
        The default ruleset
    </description>
    <rule ref="rulesets/java/strings.xml"/>
    <rule ref="rulesets/java/unusedcode.xml"/>
</ruleset>
<{1>}中的

如下:

maven-pmd-plugin

因此,我在以下用例中遇到以下问题:

public class NewClass {
    private final static String PMD_UNUSED_FORMAL_PARAMETER = "PMD.UnusedFormalParameter";

    @SuppressWarnings(PMD_UNUSED_FORMAL_PARAMETER)
    private void someMethod1(Object parameter1) {
        System.out.println("someMethod1");
    }

    @SuppressWarnings("PMD.UnusedFormalParameter")
    private void someMethod2(Object parameter1) {
        System.out.println("someMethod2");
    }

    @SuppressWarnings("PMD.UnusedFormalParameter")
    private void someMethod3(Object parameter1) {
        System.out.println("someMethod3");
    }

    @SuppressWarnings("PMD.UnusedFormalParameter")
    private void someMethod4(Object parameter1) {
        System.out.println("someMethod4");
    }

    public static void main(String[] args) {
        NewClass newClazz = new NewClass();
        newClazz.someMethod1(null);
        newClazz.someMethod2(null);
        newClazz.someMethod3(null);
    }
}

注释参数值<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.8</version> <executions> <execution> <id>pmd-check</id> <phase>validate</phase> <goals> <goal>check</goal> </goals> </execution> </executions> <configuration> <printFailingErrors>true</printFailingErrors> <detail>true</detail> <rulesets> <ruleset>${basedir}/src/main/resources/ruleset.xml</ruleset> </rulesets> </configuration> </plugin> 出现4次会导致"PMD.UnusedFormalParameter"违规。使用注释掉的AvoidDuplicateLiterals常量替换字符串会导致注释无效,从而导致private final static违规。

我不知道PMD的内部结构。作为一个开箱即用的用户,看起来奇怪的是PMD都没有用变量替换变量值(尽管这可能是一个上下文敏感的任务,它应该可以在静态代码分析的范围内,它只是复杂的)并且UnusedFormalParameter不排除显然用于抑制其他检查的字符串值,并且仅因PMD而存在。

我正在使用UnusedFormalParameter 3.8。

1 个答案:

答案 0 :(得分:1)

至于您的问题,目前有两种解决方法:

  1. AvoidDuplicateLiterals允许skipAnnotations属性设置为true以忽略注释中的文字。当然,这会忽略所有注释中的所有文字,而不仅仅是@SuppressWarnings
  2. 所有规则都允许您使用要忽略的表达式的XPath表达式配置violationSuppressXPath属性。例如,在这种情况下,您可以将其设置为AvoidDuplicateLiterals规则,以忽略@SuppressWarnings上的文字。我相信这个问题的恰当表达方式是//Annotation//Name[@Image = "SuppressWarnings" or @Image = "java.lang.SuppressWarnings"]/..//Literal(你必须对其进行测试才能确定)
  3.   

    我不了解PMD的内部情况。作为一个开箱即用的用户,看起来很奇怪,PMD都没有用它的值替换变量(即使这可能是一个上下文敏感的任务,它应该可以在静态代码的范围内分析,它只是复杂的)

    您是对的,目前不支持此行为。我只是added an issue on Github来跟踪请求。随意填写。