我在项目中配置了一个Checkstyle验证规则,该规则禁止使用超过3个输入参数来定义类方法。该规则适用于我的类,但是有时我必须扩展第三方类,而第三方类则不遵守此特定规则。
是否有可能指示“ checkstyle”应静默忽略某种方法?
顺便说一句,我最终得到了自己的checkstyle包装器:qulice.com(请参阅Java代码质量的严格控制)
我在项目中配置了一个Checkstyle验证规则,该规则禁止使用超过3个输入参数来定义类方法。该规则适用于我的类,但是有时我必须扩展第三方类,而第三方类则不遵守此特定规则。
是否有可能指示“ checkstyle”应静默忽略某种方法?
顺便说一句,我最终得到了自己的checkstyle包装器:qulice.com(请参阅Java代码质量的严格控制)
Answers:
在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中可用的另一种方法是通过@SuppressWarnings
java注释抑制违规。为此,您需要在配置文件中添加两个新模块(SuppressWarningsFilter
和SuppressWarningsHolder
):
<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:
”前缀是可选的(但建议使用)。根据文档,参数名称必须全部小写,但实践表明任何大小写都可行。
//CHECKSTYLE.OFF:
后忘记重新打开,是否仅在包含//CHECKSTYLE.OFF:
或随后所有处理过的文件中保持选中状态?
@SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")
对我来说,效果和小写字母一样好。
如果您更喜欢使用批注来选择性地使规则静音,则现在可以使用@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'
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>
CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES?
,使忽略命令更具可读性。(您将可以使用“检查下一行1的检查样式”和“检查下3行的检查的样式”)。
CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINE
也对我有用(它与line
和都匹配lines
)。
每个涉及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版中对我有用。
我对上述答案有困难,可能是因为我将checkStyle警告设置为错误。起作用的是SuppressionFilter:http : //checkstyle.sourceforge.net/config_filters.html#SuppressionFilter
这样做的缺点是,行范围存储在单独的preventsions.xml文件中,因此不熟悉的开发人员可能不会立即建立连接。
<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
您可以尝试 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