如何解决在 PMD
我正在 PMD 中设置自定义规则,但在不使用已弃用的功能的情况下无法使 XPath 抑制工作。我使用的是 PMD 6.32。
我的规则是修改Shortvariable
规则集中的规则Java/Codestyle
:
<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']"/>
应该抑制主方法中方法的规则,但正在抑制其他方法和应用程序类的规则
解决方法
至于您的问题:
- 替换是正确的,除了弃用之外没有任何区别,实际上the code reads:
/**
* @deprecated Use {@link #getName()}
* @return
*/
@Override
@DeprecatedAttribute(replaceWith = "@Name")
@Deprecated
public String getImage() {
return getName();
}
/** Returns the name of the variable. */
public String getName() {
return super.getImage();
}
注意使用 .
来引用上下文节点。应避免在表达式的开头使用 //
,因为它会测试文件中的所有节点,并抑制比预期更多的违规。
所以你应该使用:
<property name="violationSuppressXPath" value=".[@Name='id']"/>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。