특정 코드 줄에 대해 특정 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을 통해 을 억제하는 입니다.@SuppressWarnings
2개의 모듈(모듈 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:
프리픽스는 옵션입니다(단, 권장).매뉴얼에 따르면 파라미터 이름은 모두 소문자로 해야 하는데, 관례상으로는 어떤 경우든 효과가 있습니다.
, 를 할 수 .@SuppressWarnings
Checkstyle 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
하고 있는 경우qulice
mvn 플러그인(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
'programing' 카테고리의 다른 글
Vuex에서 커밋을 트리거하기 위해 getter 및 setter와 함께 계산된 속성을 사용하는 방법 (0) | 2022.08.23 |
---|---|
C 부동 소수점 리터럴을 플로팅(이중값이 아닌) (0) | 2022.08.23 |
C 및 C++ : 자동구조 부분 초기화 (0) | 2022.08.23 |
getter에서 rootState를 가져올 수 없습니다. (0) | 2022.08.23 |
데이터가 Vue.js에 로드될 때까지 '찾을 수 없음' 오류를 지연시키는 방법 (0) | 2022.08.23 |