特定のコード行の特定のチェックスタイルルールを無効にする方法は?


183

私が持っているのCheckstyle 3つの以上の入力パラメータを持つクラスメソッドを定義するために禁止している私のプロジェクトで構成された検証ルールを、。このルールは私のクラスでは問題なく機能しますが、この特定のルールに従わないサードパーティのクラスを拡張する必要がある場合があります。

「checkstyle」に特定のメソッドを黙って無視するように指示する可能性はありますか?

ところで、私はcheckstyle:qulice.comの独自のラッパーで終わりました(Javaコード品質の厳格な制御を参照)

回答:


291

http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilterで supressionCommentFilterの使用を確認してください。モジュールを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

*注意:以下も追加する必要があります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で現在利用可能なもう1つの方法は、@SuppressWarningsjavaアノテーションを介して違反を抑制することです。これを行うには、構成ファイルに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 {

注意: " checkstyle:"プレフィックスはオプションです(ただし推奨されます)。ドキュメントによると、パラメータ名はすべて小文字にする必要がありますが、慣例では大文字と小文字が機能することが示されています。


7
TreeWalterにFileContentsHolderを追加することを忘れないでください。stackoverflow.com/a/5764666/480483を
djjeck 2014年

2
使用//CHECKSTYLE.OFF: してから再びオンにするのを忘れた場合、それが含まれているファイルのみ、//CHECKSTYLE.OFF: またはその後に処理されるすべてのファイルでもオフのままになりますか?
Roland

1
@Roland、それはそのテストクラスの間だけオフのままです。
クリスナイト

1
「パラメーター名はすべて小文字でなければなりません。」@SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")小文字の同等物と同じように機能しました。
Anders Rabo Thorbeck

2
checkstyle 8.1以降、SuppressionCommentFilter はの下にある必要がTreeWalkerあり、FileContentHolderはもう必要ありません(使用可能)。
avandeursen

70

アノテーションを使用してルールを選択的に沈黙させたい場合、これは現在、 @SuppressWarningsアノテーションなりました。Checkstyle5.7以降(およびCheckstyle Mavenプラグイン2.12+でサポートされています)。

まず、でcheckstyle.xmlSuppressWarningsHolderモジュールをに追加しますTreeWalker

<module name="TreeWalker">
    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->
    <module name="SuppressWarningsHolder" />
</module>

次に、SuppressWarningsFilterthereを有効にします(の兄弟として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) { ... }

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>

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 LINES」を使用できます)。
Matt3o12、2014年

@ matt3o12 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINEも機能します(との両方に一致lineしますlines)。
Slava Semushin 2015

3

SuppressWarningsFilterに関するすべての回答は、重要な詳細がありません。すべて小文字の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では機能しました。


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を試すことができ ます

-gオプションを指定したCLIを使用してXpath抑制を生成し、-oスイッチを使用して出力を指定します。

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

Checkstyle抑制の自動生成の設定に役立つAntスニペットを次に示します。


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

suppresss-xpath.xmlは、Checkstyleルール構成でXpath抑制ソースとして指定されています。上記のスニペットでは、ファイルcs.cpからプロパティにCheckstyleクラスパスをロードしています。クラスパスを直接指定することを選択できます。

または、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;

@SuppressWarnings("PMD")
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']"/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.