我使用的是內置的規則集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。