我使用的是内置的规则集strings.xml
和unusedcode.xml
与UnusedFormalParameter与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。