我在我的项目中配置了一个Checkstyle验证规则,禁止定义具有超过3个输入参数的类方法。该规则适用于我的类,但有时我必须扩展第三方类,这些类不遵守这一特定规则。

是否有可能指示Checkstyle,某个方法应该被无声地忽略?

顺便说一句,我最终得到了我自己的Checkstyle包装器:qulice.com(参见Java代码质量的严格控制)


当前回答

如果你从qulice mvn插件(https://github.com/teamed/qulice)使用checkstyle,你可以使用以下抑制:

// @checkstyle <Rulename> (N lines)
... code with violation(s)

or


/**
 * ...
 * @checkstyle <Rulename> (N lines)
 * ...
 */
 ... code with violation(s)

其他回答

如果你更喜欢使用注释来选择性地屏蔽规则,现在可以使用@SuppressWarnings注释,从Checkstyle 5.7开始(Checkstyle Maven Plugin 2.12+支持)。

首先,在checkstyle.xml中,将SuppressWarningsHolder模块添加到TreeWalker中:

<module name="TreeWalker">
    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->
    <module name="SuppressWarningsHolder" />
</module>

接下来,在那里启用SuppressWarningsFilter(作为TreeWalker的兄弟):

<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
<module name="SuppressWarningsFilter" />

<module name="TreeWalker">
...

现在你可以注释你想要排除在Checkstyle规则之外的方法:

@SuppressWarnings("checkstyle:methodlength")
@Override
public boolean equals(Object obj) {
    // very long auto-generated equals() method
}

@SuppressWarnings参数中的checkstyle:前缀是可选的,但我喜欢用它来提醒这个警告来自哪里。规则名称必须为小写。

最后,如果你正在使用Eclipse,它会抱怨参数对它是未知的:

不支持@SuppressWarnings(“checkstyle: methodlength”)

如果你愿意,你可以在首选项中禁用这个Eclipse警告:

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'

同样工作良好的还有SuppressWithNearbyCommentFilter,它使用单个注释来抑制审计事件。

例如

// CHECKSTYLE IGNORE check FOR NEXT 1 LINES
public void onClick(View view) { ... }

配置一个过滤器,使CHECKSTYLE IGNORE check FOR NEXT var LINES避免触发对当前行和下一个var行(总共var+1行)的给定检查的任何审计:

<module name="SuppressWithNearbyCommentFilter">
    <property name="commentFormat" value="CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES"/>
    <property name="checkFormat" value="$1"/>
    <property name="influenceFormat" value="$2"/>
</module>

http://checkstyle.sourceforge.net/config.html

<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

使用实例配置一个过滤器,在包含BEGIN GENERATED CODE的注释和包含END GENERATED CODE的注释之间屏蔽审计事件:

<module name="SuppressionCommentFilter">
  <property name="offCommentFormat" value="BEGIN GENERATED CODE"/>
  <property name="onCommentFormat" value="END GENERATED CODE"/>
</module>

//BEGIN GENERATED CODE
@Override
public boolean equals(Object obj) { ... } // No violation events will be reported

@Override
public int hashCode() { ... } // No violation events will be reported
//END GENERATED CODE

查看更多

我在回答上面的问题时遇到了困难,可能是因为我将checkStyle警告设置为错误。什么工作是SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

这样做的缺点是行范围存储在单独的suppression .xml文件中,因此不熟悉的开发人员可能不会立即建立连接。

每个引用SuppressWarningsFilter的答案都缺少一个重要的细节。如果在checkstyle-config.xml中定义了全小写的id,则只能使用它。如果不是,则必须使用原来的模块名称。

例如,如果在我的checkstyle-config.xml中有:

<module name="NoWhitespaceBefore"/>

我不能使用:

@SuppressWarnings({"nowhitespacebefore"})

然而,我必须使用:

@SuppressWarnings({"NoWhitespaceBefore"})

为了让第一个语法工作,checkstyle-config.xml应该有:

<module name="NoWhitespaceBefore">
  <property name="id" value="nowhitespacebefore"/>
</module>

这对我来说是有效的,至少在CheckStyle 6.17版本中是这样。