我有以下课程:
import javax.annotation.PostConstruct;
public class PmdUnusedMethod {
private void unusedMethod() {
}
@PostConstruct
private void postConstructAnnotatedMethod() {
}
}
并定义了PMD规则集:
<rule ref="rulesets/java/unusedcode.xml"/>
在这种情况下,PMD报告了两个关于未使用方法的错误(“unusedMethod”和“postConstructAnnotatedMethod”),但我想忽略使用@PreDestroy和@PostConstruct注释的方法的规则“UnusedPrivateMethod”。
我知道我可以这样做:
<rule ref="rulesets/java/unusedcode.xml">
<exclude name="UnusedPrivateMethod"/>
</rule>
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod">
<properties>
<property name="violationSuppressXPath"
value="//ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name[@Image='PostConstruct']"/>
</properties>
</rule>
但在这种情况下,PMD跳过检查此规则,因为类中的所有方法都包含我的注释,不仅适用于使用@PostConstruct注释的方法。我希望在检查代码后,我的“unusedMethod”只有错误,PMD不会通知有关“postConstructAnnotatedMethod”的错误。
我想做这样的事情:
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod">
<properties>
<property name="violationSuppressXPath"
value="//MethodDeclaration/Annotation/Name[@Image='PostConstruct']"/>
</properties>
</rule>
仅跳过使用所需注释注释的方法,而不是所有方法。
此外,我不想使用许多@SuppressWarnings("PMD.UnusedPrivateMethod")
注释来污染我的代码。
答案 0 :(得分:0)
执行抑制XPath是以违规所在的节点为起点执行的,因此您可以简单地转到方法,并检查注释&#34;。
例如:
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod">
<properties>
<property name="violationSuppressXPath"
value="./ancestor::ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation/Name[@Image='PostConstruct']"/>
</properties>
</rule>