如何禁用特定的代码行的特定检查式规则?
我在我的项目中configuration了checkstylevalidation规则,禁止使用多于3个input参数定义类方法。 这个规则适用于我的课程,但是有时我需要扩展不遵守这个特定规则的第三方课程。
有没有可能指示“checkstyle”某个方法应该被忽略?
顺便说一下,我结束了自己的checkstyle包装: qulice.com (请参阅Java代码质量的严格控制 )
在http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter查看supressionCommentFilter的用法。; 您需要将模块添加到您的checkstyle.xml
<module name="SuppressionCommentFilter"/>
它是可configuration的。 因此,您可以在代码中添加注释以closurescheckstyle(在各个级别),然后通过在代码中使用注释再次注释。 例如
//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>
这使您可以closures对特定代码行的特定检查:
//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部分下,可以closures对模式匹配资源的单独检查。
所以,如果你有你的checkstyle.xml:
<module name="ParameterNumber"> <property name="id" value="maxParameterNumber"/> <property name="max" value="3"/> <property name="tokens" value="METHOD_DEF"/> </module>
你可以在你的抑制XML文件中closures它:
<suppress id="maxParameterNumber" files="YourCode.java"/>
Checkstyle 5.7现在提供的另一种方法是通过@SuppressWarnigns
java注释来抑制违规。 为此,您需要在configuration文件中添加新的模块(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:
”前缀是可选的(但推荐),参数名必须全部小写 。
如果您更愿意使用注释select性地使规则@SuppressWarnings
,那么现在可以使用@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 }
@SuppressWarnings
的参数中的checkstyle:
前缀是可选的,但是我喜欢它作为提醒来警告这个地方。
最后,如果你使用Eclipse,它会抱怨这个参数是未知的:
不受支持的@SuppressWarnings(“checkstyle:methodlength”)
如果您喜欢,可以在首选项中禁用此Eclipse警告:
Preferences: Java --> Compiler --> Errors/Warnings --> Annotations --> Unhandled token in '@SuppressWarnings': set to 'Ignore'
SuppressWithNebybyCommentFilter也适用于使用单独注释来抑制审计事件。
例如
// CHECKSTYLE IGNORE check FOR NEXT 1 LINES public void onClick(View view) { ... }
configuration一个filter,使CHECKSTYLE IGNORE检查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警告设置为错误。 什么工作是SuppressionFilter: http : //checkstyle.sourceforge.net/config_filters.html#SuppressionFilter
这样做的缺点是行范围存储在一个单独的suppresssions.xml文件中,所以陌生的开发人员可能不会立即build立连接。
<module name="Checker"> <module name="SuppressionCommentFilter"/> <module name="TreeWalker"> <module name="FileContentsHolder"/> </module> </module>
configurationfilter以在包含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
查看更多
每一个引用SuppressWarningsFilter的答案都缺less一个重要的细节。 你只能使用全小写的ID,如果它在你的checkstyle-config.xml中定义的话。 如果不是,则必须使用原始模块名称。
例如,如果在我的checkstyle-config.xml中有:
<module name="NoWhitespaceBefore"/>
我不能使用:
@SuppressWarnings({"nowhitespacebefore"})
但是,我必须使用:
@SuppressWarnings({"NoWhitespaceBefore"})
为了使第一个语法工作,checkstyle-config.xml应该有:
<module name="NoWhitespaceBefore"> <property name="id" value="nowhitespacebefore"/> </module>
这对我来说是至关重要的,至less在CheckStyle 6.17版本中是这样的。