2017-07-25 83 views
0

我使用的是内置的规则集strings.xmlunusedcode.xmlUnusedFormalParameter与AvoidDuplicateLiterals在Maven的PMD-插件

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

maven-pmd-plugin如下:

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

所以,我得到在以下用例中存在以下问题:

 
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); 
    } 
} 

注释参数值"PMD.UnusedFormalParameter"出现4次导致AvoidDuplicateLiterals违规。用注释掉的字符串private final static替换字符串会导致注释不起作用,从而导致违反UnusedFormalParameter

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

我正在使用maven-pmd-plugin 3.8。

回答

1

至于你的问题,目前有两种方法可以解决此问题:

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

我不知道PMD的内部。作为一个开箱即用的用户,看起来很奇怪的是,PMD并没有用变量的值来代替变量(尽管这可能是一个上下文敏感的任务,它应该可以在静态代码分析的范围内进行,但这很复杂)

你说得对,这种行为目前不支持。我只需要added an issue on Github来跟踪请求。随意筹入。