我在我的項目中配置了一個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