programing

특정 코드 줄에 대해 특정 Checkstyle 규칙을 비활성화하시겠습니까?

nicescript 2022. 8. 23. 23:26
반응형

특정 코드 줄에 대해 특정 Checkstyle 규칙을 비활성화하시겠습니까?

프로젝트에 Checkstyle 유효성 검사 규칙이 구성되어 있어 입력 매개 변수가 3개 이상인 클래스 메서드를 정의할 수 없습니다.이 규칙은 내 수업에는 잘 적용되지만, 가끔은 이 특정 규칙을 따르지 않는 서드파티 수업을 확장해야 할 때도 있습니다.

Checkstyle에게 특정 메서드를 무시하도록 지시할 수 있습니까?

그런데, Checkstyle의 자체 래퍼 qulice.com을 갖게 되었습니다(자바 코드 품질에 대한 엄격한 관리 참조).

http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter 에서 suppression Comment Filter 의 사용법을 확인해 주세요.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>

suppression xml 파일에서 이 기능을 해제할 수 있습니다.

<suppress id="maxParameterNumber" files="YourCode.java"/>

에서 사용 한 다른은 Checkstyle 5.7을 통해 을 억제하는 입니다.@SuppressWarnings2개의 모듈(모듈 2개)을해야 합니다.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 {

NB: "checkstyle:프리픽스는 옵션입니다(단, 권장).매뉴얼에 따르면 파라미터 이름은 모두 소문자로 해야 하는데, 관례상으로는 어떤 경우든 효과가 있습니다.

, 를 할 수 .@SuppressWarningsCheckstyle 5.7 check( ( Checkstyle Maven Plugin 2.12 + )

당신의 your 에, 객객에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를 사용하고 있는 경우, Eclipse는 이 주장이 알려지지 않은 것에 대해 불만을 제기합니다.

지원되지 않는 @SuppressWarnings("checkstyle:methodlength")

원하는 경우 환경설정에서 이클립스 경고를 비활성화할 수 있습니다.

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'

또한 잘 작동하는 것은 억제입니다.WithNearbyCommentFilter: 개별 코멘트를 사용하여 감사 이벤트를 억제합니다.

예를들면

// CHECKSTYLE IGNORE check FOR NEXT 1 LINES
public void onClick(View view) { ... }

CHECKSTYLE IGNORE FOR NEXT var LINE(다음 var LINE에 대한 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

Suppress Warnings Filter를 참조하는 모든 답변에는 중요한 세부 정보가 누락되어 있습니다.모두 소문자 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>

적어도 CheckStyle 6.17 버전에서는 이것이 나에게 효과가 있었습니다.

CheckStyle 경고를 오류로 설정했기 때문에 위의 답변에 문제가 있었습니다.Suppression Filter : http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter supp 。

단점은 회선 범위가 별도의 suppressions.xml 파일에 저장되기 때문에 익숙하지 않은 개발자가 즉시 접속할 수 없다는 것입니다.

<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

BEGIN GENTERATED CODE 행을 포함하는 코멘트와 END GENTERATED 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

더 보기

하고 있는 경우qulicemvn 플러그인(https://github.com/teamed/qulice)에서는 다음 억제를 사용할 수 있습니다.

// @checkstyle <Rulename> (N lines)
... code with violation(s)

또는


/**
 * ...
 * @checkstyle <Rulename> (N lines)
 * ...
 */
 ... code with violation(s)

https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathFilter에 접속해 보세요.

다음과 같이 설정할 수 있습니다.


<module name="SuppressionXpathFilter">
  <property name="file" value="suppressions-xpath.xml"/>
  <property name="optional" value="false"/>
</module>
        

-g 옵션을 사용하여 CLI를 사용하여 Xpath 억제를 생성하고 -o 스위치를 사용하여 출력을 지정합니다.

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

Check style suppressions auto generation을 설정하는 데 도움이 되는 개미 스니펫을 소개합니다.Antrun 플러그인을 사용하여 Maven에 통합할 수 있습니다.


<target name="checkstyleg">
    <move file="suppressions-xpath.xml"
      tofile="suppressions-xpath.xml.bak"
      preservelastmodified="true"
      force="true"
      failonerror="false"
      verbose="true"/>
    <fileset dir="${basedir}"
                    id="javasrcs">
    <include name="**/*.java" />
    </fileset>
    <pathconvert property="sources"
                            refid="javasrcs"
                            pathsep=" " />
    <loadfile property="cs.cp"
                        srcFile="../${cs.classpath.file}" />
    <java classname="${cs.main.class}"
                logError="true">
    <arg line="-c ../${cs.config} -p ${cs.properties} -o ${ant.project.name}-xpath.xml -g ${sources}" />
    <classpath>
        <pathelement path="${cs.cp}" />
        <pathelement path="${java.class.path}" />
    </classpath>
</java>
<condition property="file.is.empty" else="false">
     <length file="${ant.project.name}-xpath.xml" when="equal" length="0" />
   </condition>
   <if>
     <equals arg1="${file.is.empty}" arg2="false"/>
     <then>
     <move file="${ant.project.name}-xpath.xml"
      tofile="suppressions-xpath.xml"
      preservelastmodified="true"
      force="true"
      failonerror="true"
  verbose="true"/>
   </then>
</if>
    </target>

suppressions-xpath.xml은 Checkstyle 규칙 설정에서 Xpath 억제 소스로 지정됩니다.위의 스니펫에서는 Checkstyle 클래스 경로를 파일 cs.cp에서 속성으로 로드하고 있습니다.클래스 경로를 직접 지정하도록 선택할 수 있습니다.

또는 Maven(또는 Ant) 내에서 groovy를 사용하여 동일한 작업을 수행할 수도 있습니다.


import java.nio.file.Files
import java.nio.file.StandardCopyOption  
import java.nio.file.Paths

def backupSuppressions() {
  def supprFileName = 
      project.properties["checkstyle.suppressionsFile"]
  def suppr = Paths.get(supprFileName)
  def target = null
  if (Files.exists(suppr)) {
    def supprBak = Paths.get(supprFileName + ".bak")
    target = Files.move(suppr, supprBak,
        StandardCopyOption.REPLACE_EXISTING)
    println "Backed up " + supprFileName
  }
  return target
}

def renameSuppressions() {
  def supprFileName = 
      project.properties["checkstyle.suppressionsFile"]
  def suppr = Paths.get(project.name + "-xpath.xml")
  def target = null
  if (Files.exists(suppr)) {
    def supprNew = Paths.get(supprFileName)
    target = Files.move(suppr, supprNew)
    println "Renamed " + suppr + " to " + supprFileName
  }
  return target
}

def getClassPath(classLoader, sb) {
  classLoader.getURLs().each {url->
     sb.append("${url.getFile().toString()}:")
  }
  if (classLoader.parent) {
     getClassPath(classLoader.parent, sb)
  }
  return sb.toString()
}

backupSuppressions()

def cp = getClassPath(this.class.classLoader, 
    new StringBuilder())
def csMainClass = 
      project.properties["cs.main.class"]
def csRules = 
      project.properties["checkstyle.rules"]
def csProps = 
      project.properties["checkstyle.properties"]

String[] args = ["java", "-cp", cp,
    csMainClass,
    "-c", csRules,
"-p", csProps,
"-o", project.name + "-xpath.xml",
"-g", "src"]

ProcessBuilder pb = new ProcessBuilder(args)
pb = pb.inheritIO()
Process proc = pb.start()
proc.waitFor()

renameSuppressions()

Xpath 억제를 사용할 때의 유일한 단점은 지원되지 않는 검사 외에 다음과 같은 코드가 있는 경우입니다.

package cstests;

public interface TestMagicNumber {
  static byte[] getAsciiRotator() {
    byte[] rotation = new byte[95 * 2];
    for (byte i = ' '; i <= '~'; i++) {
      rotation[i - ' '] = i;
      rotation[i + 95 - ' '] = i;
    }
    return rotation;
  }
}

이 경우 생성된 Xpath 억제는 Checkstyle에 의해 수집되지 않으며 생성된 억제를 제외하고 체커는 실패합니다.

<suppress-xpath
       files="TestMagicNumber.java"
       checks="MagicNumberCheck"
       query="/INTERFACE_DEF[./IDENT[@text='TestMagicNumber']]/OBJBLOCK/METHOD_DEF[./IDENT[@text='getAsciiRotator']]/SLIST/LITERAL_FOR/SLIST/EXPR/ASSIGN[./IDENT[@text='i']]/INDEX_OP[./IDENT[@text='rotation']]/EXPR/MINUS[./CHAR_LITERAL[@text='' '']]/PLUS[./IDENT[@text='i']]/NUM_INT[@text='95']"/>

다른 모든 위반을 수정하고 나머지를 억제하려면 Xpath 억제를 생성하는 것이 좋습니다.코드 내에서 억제할 특정 인스턴스를 선택할 수 없습니다.단, 생성된 파일에서 억제를 선택하여 선택할 수 있습니다.

SuppressionXpathSingleFilter는 특정 규칙, 파일 또는 오류 메시지를 식별하고 억제하는 데 적합합니다.id Atribut으로 각각을 식별하는 복수의 필터를 설정할 수 있습니다.

https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathSingleFilter

특정 경고를 비활성화하는 코드를 다음과 같은 특별한 설명으로 둘러쌀 수도 있습니다.

// CHECKSTYLE:DISABLE:<CheckName>
<Your code goes here>
// CHECKSTYLE:ENABLE:<CheckName>

예:// CHECKSTYLE:DISABLE:ParameterNumberCheck

지원되는 체크의 전체 목록은 여기에서 확인할 수 있습니다(직접 알려진 하위 클래스 참조).

언급URL : https://stackoverflow.com/questions/4023185/disable-a-particular-checkstyle-rule-for-a-particular-line-of-code

반응형