微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 PMD

如何解决在 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>

我遇到了两个问题:

  1. 运行检查时,我在日志中得到以下信息: java.lang.RuntimeException: Use of deprecated attribute 'VariableDeclaratorId/@Image' in a findChildNodesWithXPath navigation,please use @Name instead。但是,当我将 @Image 的任何实例更改为 @Name 时,检查失败。
  2. 这个特殊规则没有像我希望的那样发挥作用。我想保留原始规则,但如果字段名称id,则取消它。相反,如果有一个名为 id 的字段,它会抑制类中所有变量的规则。规则应该是什么?

编辑 使用以下方法解决了未正确应用 id 规则的问题: <property name="violationSuppressXPath" value="./.[@Name='id']"/>

但是,在将 @Image 的实例更改为 @Name 后,一些其他抑制根本没有被应用:

<property name="violationSuppressXPath" value="./MethodDeclarator[@Name='hashCode' or @Name='equals']"/> 应该禁止方法名称 hashCodeequals 上的规则,但不是

<property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Interface='true' and (ends-with(@Name,'Repository'))]"/> 应该禁止名称Repository 结尾的类中的方法规则,但不是

<property name="violationSuppressXPath" value="//MethodDeclarator[@Name='main']"/> 应该抑制主方法方法的规则,但正在抑制其他方法和应用程序类的规则

解决方法

至于您的问题:

  1. 替换是正确的,除了弃用之外没有任何区别,实际上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();
    }
  1. 根据the documentation on XPath suppression

注意使用 . 来引用上下文节点。应避免在表达式的开头使用 //,因为它会测试文件中的所有节点,并抑制比预期更多的违规。

所以你应该使用:

<property name="violationSuppressXPath" value=".[@Name='id']"/>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。