【发布时间】:2021-03-03 16:12:51
【问题描述】:
我正在 PMD 中设置自定义规则,但在不使用已弃用功能的情况下,我无法让 XPath 抑制正常工作。我正在使用 PMD 6.32。
我的规则是修改Java/Codestyle规则集中的规则ShortVariable:
<rule ref="category/java/codestyle.xml/ShortVariable">
<properties>
<!-- ignore ID -->
<property name="violationSuppressXPath" value="//VariableDeclaratorId[@Image='id']"/>
</properties>
</rule>
我遇到了两个问题:
- 当我运行检查时,我在日志中得到以下信息:
java.lang.RuntimeException: Use of deprecated attribute 'VariableDeclaratorId/@Image' in a findChildNodesWithXPath navigation, please use @Name instead。但是,当我将@Image的任何实例更改为@Name时,检查将失败。 - 这个特殊的规则没有像我希望的那样起作用。我想保留原始规则,但如果字段名称为
id,则禁止它。相反,如果有一个名为id的字段,它会抑制类中所有变量的规则。规则应该是什么?
编辑
使用以下方法解决了 id 规则未正确应用的问题:
<property name="violationSuppressXPath" value="./.[@Name='id']"/>
但是,在将 @Image 的实例更改为 @Name 之后,根本没有应用其他一些抑制:
<property name="violationSuppressXPath" value="./MethodDeclarator[@Name='hashCode' or @Name='equals']"/> 应该禁止对方法名称 hashCode 或 equals 的规则,但不是
<property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Interface='true' and (ends-with(@Name, 'Repository'))]"/> 应该禁止对名称以 Repository 结尾的类中的方法的规则,但不是
<property name="violationSuppressXPath" value="//MethodDeclarator[@Name='main']"/> 应该抑制主方法中方法的规则,但正在抑制其他方法和应用程序类的规则
【问题讨论】: