我正在使用内置规则集strings.xml
和unusedcode.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。
答案 0 :(得分:1)
至于您的问题,目前有两种解决方法:
AvoidDuplicateLiterals
允许skipAnnotations
属性设置为true
以忽略注释中的文字。当然,这会忽略所有注释中的所有文字,而不仅仅是@SuppressWarnings
violationSuppressXPath
属性。例如,在这种情况下,您可以将其设置为AvoidDuplicateLiterals
规则,以忽略@SuppressWarnings
上的文字。我相信这个问题的恰当表达方式是//Annotation//Name[@Image = "SuppressWarnings" or @Image = "java.lang.SuppressWarnings"]/..//Literal
(你必须对其进行测试才能确定)我不了解PMD的内部情况。作为一个开箱即用的用户,看起来很奇怪,PMD都没有用它的值替换变量(即使这可能是一个上下文敏感的任务,它应该可以在静态代码的范围内分析,它只是复杂的)
您是对的,目前不支持此行为。我只是added an issue on Github来跟踪请求。随意填写。