如何禁用特定代码行的特定checkstyle规则?


183

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

是否有可能指示“ checkstyle”应静默忽略某种方法?

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

Answers:


290

http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter上检查supressionCommentFilter的使用。您需要将模块添加到您的checkstyle.xml中

<module name="SuppressionCommentFilter"/>

并且它是可配置的。因此,您可以在代码中添加注释以关闭checkstyle(在各个级别上),然后通过在代码中使用注释再次将其重新打开。例如

//CHECKSTYLE:OFF
public void someMethod(String arg1, String arg2, String arg3, String arg4) {
//CHECKSTYLE:ON

甚至更好的是,使用此调整后的版本:

<module name="SuppressionCommentFilter">
    <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
    <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
    <property name="checkFormat" value="$1"/>
</module>

它允许您关闭对特定代码行的特定检查:

//CHECKSTYLE.OFF: IllegalCatch - Much more readable than catching 7 exceptions
catch (Exception e)
//CHECKSTYLE.ON: IllegalCatch

*注意:您还必须添加FileContentsHolder

<module name="FileContentsHolder"/>

也可以看看

<module name="SuppressionFilter">
    <property name="file" value="docs/suppressions.xml"/>
</module>

SuppressionFilter同一页面上的部分下,您可以关闭对模式匹配资源的单独检查。

因此,如果您在checkstyle.xml中:

<module name="ParameterNumber">
   <property name="id" value="maxParameterNumber"/>
   <property name="max" value="3"/>
   <property name="tokens" value="METHOD_DEF"/>
</module>

您可以使用以下命令在抑制XML文件中将其关闭:

<suppress id="maxParameterNumber" files="YourCode.java"/>

现在,Checkstyle 5.7中可用的另一种方法是通过@SuppressWarningsjava注释抑制违规。为此,您需要在配置文件中添加两个新模块(SuppressWarningsFilterSuppressWarningsHolder):

<module name="Checker">
   ...
   <module name="SuppressWarningsFilter" />
   <module name="TreeWalker">
       ...
       <module name="SuppressWarningsHolder" />
   </module>
</module> 

然后,在您的代码中,您可以执行以下操作:

@SuppressWarnings("checkstyle:methodlength")
public void someLongMethod() throws Exception {

或者,对于多重抑制:

@SuppressWarnings({"checkstyle:executablestatementcount", "checkstyle:methodlength"})
public void someLongMethod() throws Exception {

注意:checkstyle:”前缀是可选的(但建议使用)。根据文档,参数名称必须全部小写,但实践表明任何大小写都可行。


7
记住要在TreeWalter上添加FileContentsHolder。参见stackoverflow.com/a/5764666/480483
djjeck

2
如果使用//CHECKSTYLE.OFF: 后忘记重新打开,是否仅在包含//CHECKSTYLE.OFF: 或随后所有处理过的文件中保持选中状态?
罗兰

1
@Roland,仅在该测试课程期间不启用。
克里斯·奈特

1
“参数名称必须全部小写。” @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")对我来说,效果和小写字母一样好。
安德斯·拉博·索贝克

2
checkstyle 8.1开始SuppressionCommentFilter应该位于之下TreeWalker,并且FileContentHolder不再是必需的(可用)。
avandeursen

69

如果您更喜欢使用批注来选择性地使规则静音,则现在可以使用@SuppressWarnings批注来实现,从Checkstyle 5.7(由Checkstyle Maven插件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
}

checkstyle:参数to中的前缀@SuppressWarnings是可选的,但我想提醒您此警告的来源。规则名称必须为小写。

最后,如果您使用的是Eclipse,它将抱怨该参数未知:

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

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

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

2
我将此作为提名的答案,因为我认为这是在大多数情况下最好的解决方案。
avandeursen

33

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


我将更改正则表达式CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES?,使忽略命令更具可读性。(您将可以使用“检查下一行1的检查样式”和“检查下3行的检查的样式”)。
Matt3o12 2014年

@ matt3o12 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINE也对我有用(它与line和都匹配lines)。
Slava Semushin

3

每个涉及SuppressWarningsFilter的答案都缺少一个重要的细节。如果在checkstyle-config.xml中定义了全小写的ID,则只能使用全小写的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版中对我有用。



1
<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

看更多


0

您可以尝试 https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathFilter

使用带有-g选项的CLI生成Xpath抑制。然后,选择特定于您要抑制的行的抑制元素。将其保存在禁止文件中,并在上方的SuppressionXpathFilter元素中指定该文件路径。

https://checkstyle.sourceforge.io/cmdline.html#Command_line_usage

如果您使用的是ant,则可以将此帖子称为ant任务,以用于生成抑制Xpath文件。

https://github.com/checkstyle/checkstyle/issues/6934#issuecomment-522289083

查看此线程以了解如何使用过滤器:

https://groups.google.com/forum/m/#!topic/checkstyle/F_f6R_Qk1EM

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.