205

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

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

ところで、私はCheckstyleの独自のラッパーであるqulice.comに行き着きました( Javaコード品質の厳密な制御を参照) 。

4

9 に答える 9

316

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で利用できるようになったもう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:"プレフィックスはオプションです(ただし推奨されます)。ドキュメントによると、パラメータ名はすべて小文字である必要がありますが、実際にはどのような場合でも機能することが示されています。

于 2010-10-26T11:52:40.553 に答える
78

アノテーションを使用してルールを選択的に消音する場合は、Checkstyle 5.7以降のアノテーションを使用してこれが可能に@SuppressWarningsなりました(Checkstyle Mavenプラグイン2.12+でサポートされています)。

まず、で、モジュールを:checkstyle.xmlに追加します。SuppressWarningsHolderTreeWalker

<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'
于 2014-03-21T10:36:23.070 に答える
34

また、個々のコメントを使用して監査イベントを抑制するSuppressWithNearbyCommentFilterも適切に機能します。

例えば

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

CHECKSTYLE IGNORE check 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

于 2012-02-17T21:51:03.837 に答える
5

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ではうまくいったことです。

于 2016-04-22T12:22:07.843 に答える
2

checkStyleの警告をエラーに設定したことが原因で、上記の回答に問題がありました。動作したのはSuppressionFilterでした:http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

これの欠点は、行範囲が別のsuppressions.xmlファイルに保存されるため、見慣れない開発者がすぐに接続できない可能性があることです。

于 2016-11-03T14:42:36.670 に答える
1
<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

行BEGINGENERATEDCODEを含むコメントと行ENDGENERATEDCODEを含むコメントの間の監査イベントを抑制するようにフィルターを構成するには:

<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

続きを見る

于 2017-08-18T14:38:05.840 に答える
1

qulicemvnプラグイン(https://github.com/teamed/qulice)のcheckstyleを使用している場合は、次の抑制を使用できます。

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

また


/**
 * ...
 * @checkstyle <Rulename> (N lines)
 * ...
 */
 ... code with violation(s)
于 2021-01-28T21:01:12.497 に答える
0

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

これは、Checkstyle抑制の自動生成を設定するのに役立つantスニペットです。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>

抑制-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;

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属性でそれぞれを識別する複数のフィルターを構成できます。

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

于 2019-11-27T13:15:14.717 に答える
0

特定の警告を無効にするコードを次の特別なコメントで囲むこともできます。

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

例えば:// CHECKSTYLE:DISABLE:ParameterNumberCheck

サポートされているチェックの完全なリストは、ここにあります(直接既知のサブクラスを参照)。

于 2021-08-16T06:31:38.917 に答える