특정 코드 줄에 대해 특정 체크 스타일 규칙을 비활성화하는 방법은 무엇입니까?


183

나는이 checkstyle의 3 개 이상의 입력 매개 변수와 클래스 메소드를 정의하는 금지 내 프로젝트에서 구성 유효성 검사 규칙을. 규칙은 대한 벌금을 작동 수업, 그러나 때때로 나는이 특정 규칙을 준수하지 않는 타사 클래스를 확장해야합니다.

"checkstyle"에 특정 방법을 자동으로 무시하도록 지시 할 가능성이 있습니까?

BTW, 나는 checkstyle : qulice.com 의 자체 래퍼로 끝났습니다 ( Java Code Quality의 엄격한 제어 참조 )

답변:


291

http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter 에서 supressionCommentFilter 사용을 확인 하십시오 . checkstyle.xml에 모듈을 추가해야합니다

<module name="SuppressionCommentFilter"/>

구성 할 수 있습니다. 따라서 코드에 주석을 추가하여 체크 스타일을 끄고 (다양한 수준에서) 코드에서 주석을 사용하여 다시 다시 설정할 수 있습니다. 예 :

//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 {

NB : " checkstyle:"접두어는 선택 사항입니다 (권장). 문서에 따르면 매개 변수 이름은 모두 소문자 여야하지만 실제로는 모든 경우가 작동 함을 나타냅니다.


7
TreeWalter에 FileContentsHolder를 추가해야합니다.
djjeck

2
사용 //CHECKSTYLE.OFF: 했다가 다시 켜는 것을 잊어 버린 경우 , 파일을 포함하는 파일 //CHECKSTYLE.OFF: 또는 이후에 처리 된 모든 파일에서만 확인 된 상태로 유지 됩니까?
Roland

1
@ 롤랜드, 그것은 그 시험 수업 기간 동안 만 꺼져 있습니다.
Chris Knight

1
"매개 변수 이름은 모두 소문자 여야합니다." @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")소문자 동등만큼 나에게도 효과가있었습니다.
Anders Rabo Thorbeck

2
이후 checkstyle 8.1 SuppressionCommentFilter는 언더해야 TreeWalker하고는 FileContentHolder더 이상 필요 (가능) 없습니다.
avandeursen

70

주석을 사용하여 규칙을 선택적으로 침묵 @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으로 형제를 사용하여 거기를 활성화하십시오 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:에 대한 인수 의 접두어 @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) { ... }

다음 var LINES에 대한 CHECKSTYLE IGNORE 검사가 현재 행 및 다음 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?ignore 명령을 더 읽기 쉽게 만드는 정규식을 변경했습니다 . ( "CHECKSTYLE IGNORE check FOR NEXT 1 LINE"및 "CHECKSTYLE IGNORE check FOR NEXT 3 LINE"을 사용할 수 있습니다).
Matt3o12

@ matt3o12은 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINE또한 (이 모두 일치하는 나를 위해 작동 linelines).
Slava Semushin

3

SuppressWarningsFilter를 언급하는 모든 답변 에는 중요한 세부 사항이 없습니다. 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에서 나를 위해 일한 것입니다.


1

checkStyle 경고를 오류로 설정했기 때문에 위의 답변에 어려움을 겪었습니다. 작동 한 것은 SuppressionFilter : http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

이것의 단점은 라인 범위가 별도의 suppresssions.xml 파일에 저장되어 있기 때문에 익숙하지 않은 개발자가 즉시 연결하지 못할 수 있다는 것입니다.


고맙습니다, 그것은 나를 위해 일한 유일한 것입니다
jonathanrz

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를 사용해 볼 수 있습니다

CLI를 -g 옵션과 함께 사용하여 Xpath 억제를 생성하십시오. 그런 다음 억제하려는 줄에 고유 한 억제 요소를 선택하십시오. 이를 억제 파일에 저장하고 위의 SuppressionXpathFilter 요소에 해당 파일 경로를 지정하십시오.

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

개미를 사용하는 경우이 게시물을 개미 작업으로 참조하여 억제 Xpath 파일을 생성 할 수 있습니다.

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

필터 사용 방법에 대해서는이 스레드를 확인하십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.