我在我的项目中配置了一个checkstyle验证规则,该规则禁止使用多于3个输入参数定义类方法。该规则适用于我的类,但有时我必须扩展第三方类,它们不遵守此特定规则。如何禁用特定代码行的特定checkstyle规则?
是否有可能指示“checkstyle”应该默默忽略某个方法?
BTW,我结束了我自己的CheckStyle的包装:qulice.com(见Strict Control of Java Code Quality)
我在我的项目中配置了一个checkstyle验证规则,该规则禁止使用多于3个输入参数定义类方法。该规则适用于我的类,但有时我必须扩展第三方类,它们不遵守此特定规则。如何禁用特定代码行的特定checkstyle规则?
是否有可能指示“checkstyle”应该默默忽略某个方法?
BTW,我结束了我自己的CheckStyle的包装:qulice.com(见Strict Control of Java Code Quality)
退房利用supressionCommentFilter在http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter。您需要将模块添加到您的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
也见
<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是通过@SuppressWarnigns
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:
” 前缀是可选的(但建议)和参数名必须全部小写。
还有效的是SuppressWithNearbyCommentFilter,它使用单独的注释来抑制审计事件。
例如
// CHECKSTYLE IGNORE check FOR NEXT 1 LINES
public void onClick(View view) { ... }
要配置的过滤器,使得CHECKSTYLE IGNORE检查NEXT变种LINES避免触发任何审计用于当前行和下一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?',这将使ignore命令更具可读性。 (您可以使用“CHECKSTYLE IGNORE check for NEXT 1 LINE”和“CHECKSTYLE IGNORE check for NEXT 3 LINES”)。 – Matt3o12 2014-05-28 17:10:43
@ matt3o12'CHECKSTYLE IGNORE(\ w +)FOR NEXT(\ d +)LINE'也适用于我(它匹配'line'和'lines')。 – 2015-07-22 08:10:32
如果你喜欢使用注解来选择性沉默的规则,这是现在可以使用@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
有:
<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
<module name="SuppressWarningsFilter" />
现在你可以注释例如你想要的方法,从一定的Checkstyle规则排除:
@SuppressWarnings("checkstyle:methodlength")
@Override
public boolean equals(Object obj) {
// very long auto-generated equals() method
}
的checkstyle:
前缀的参数@SuppressWarnings
是可选的,但我喜欢它看作是这个警告是从哪里来的提醒。
最后,如果你使用Eclipse,它会抱怨参数暂时未知到它:
不支持@SuppressWarnings( “CheckStyle的:methodlength”)
可以禁用此在Eclipse中的喜好警告,如果你喜欢:
Preferences:
Java
--> Compiler
--> Errors/Warnings
--> Annotations
--> Unhandled token in '@SuppressWarnings': set to 'Ignore'
每一个答案,指的SuppressWarningsFilter缺少的重要DET AIL。如果您的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为我工作。
我对上述答案有困难,可能是因为我将checkStyle警告设置为错误。什么是SuppressionFilter:http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter
这样做的缺点是行范围存储在单独的suppresssions.xml文件中,因此不熟悉的开发人员可能不会立即建立连接。
谢谢,这也是我唯一的工作 – jonathanrz 2017-03-16 00:34:32
<module name="Checker">
<module name="SuppressionCommentFilter"/>
<module name="TreeWalker">
<module name="FileContentsHolder"/>
</module>
</module>
要配置滤波器来抑制含行开始生成的代码和含线END评论评论之间的审计事件生成代码:
<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
这只能省略警报,但问题仍然出现在审计中...... – viruskimera 2017-09-28 16:49:55
记住添加FileContentsHolder在TreeWalter 。如果您使用'// CHECKSTYLE.OFF:',请参阅http://stackoverflow.com/a/5764666/480483 – djjeck 2014-01-16 22:23:39
,然后忘记再次打开它,它是否仅在包含“// CHECKSTYLE”的文件中保持关闭状态。 OFF:还是所有随后处理的文件? – Roland 2014-09-30 17:58:02
@Roland,它只是在测试课期间关闭。 – 2014-09-30 22:12:48