web-dev-qa-db-ja.com

生成コードなどの特定のディレクトリまたはファイルに対するJava警告を抑制する方法

ややsomewhatいコードを作成するパーサージェネレーターを使用しています。その結果、私のEclipseプロジェクトには、生成されたソースファイルから発生する数十の警告があります。 @SuppressWarningアノテーションを使用して特定の要素の特定の警告を抑制することができますが、パーサージェネレーターを再度実行すると、手動で追加したアノテーションは失われます。特定のファイルまたはディレクトリの警告を抑制するようにEclipseを構成する方法はありますか?

109
Chris Conway

バージョン3.8 M6以降、Eclipse(正確にはJDT)にはこの機能が組み込まれています。プロジェクトのビルドパスを通じて構成可能です:Project properties> Java Build Path> Compiler> Source

enter image description here

ここで発表: Eclipse 3.8 and 4.2 M6-New and Noteworthy 、calledソースフォルダーからのエラー/警告を選択的に無視します。また、そこからスクリーンショットがあります。これは、以前にリンクされた Bug 220928 で開発された新しい機能です。

89

このチケットは Bug 220928 であり、Eclipse 3.8で完成しました。詳細については この回答 をご覧ください。

Eclipse 3.7以前で止まっている場合:そのチケットにコメントするユーザー「Marc」が comment 35 で「warningcleaner」というプラグインを作成(または少なくともリンク)します。この機能がEclipseに統合されるのを待っている間、私はそれを大成功で使用しています。

とても簡単です:

  1. プラグインをインストールします。
  2. プロジェクトを右クリックし、「生成されたコードの性質を追加/削除」を選択します。
  3. プロジェクト設定を開きます(右クリックして[プロパティ]を選択します)。
  4. 「警告クリーナー」タブを開きます。
  5. 警告を無視するソースフォルダーを選択します。

Warning Cleaner screenshot

20

私は、maven regexp replaceプラグインを使用してこれを解決しました-原因を解決しませんが、痛みを癒します:

<plugin>
  <groupId>com.google.code.maven-replacer-plugin</groupId>
  <artifactId>maven-replacer-plugin</artifactId>
  <version>1.3.2</version>
  <executions>
<execution>
  <phase>prepare-package</phase>
  <goals>
    <goal>replace</goal>
  </goals>
</execution>
  </executions>
  <configuration>
<includes>
  <include>target/generated-sources/antlr/**/*.Java</include>
</includes>

<regex>true</regex>
<regexFlags>
  <regexFlag>MULTILINE</regexFlag>
</regexFlags>

<replacements>
  <replacement>
    <token>^public class</token>
    <value>@SuppressWarnings("all") public class</value>
  </replacement>
</replacements>
  </configuration>
</plugin>

**表記を機能させることができなかったため、パスを正確に指定する必要がある場合があります。

重複する@SupressWarningsを生成しない方法の改善については、以下のコメントを参照してください

17
Knubo

あなたができる最善のことは、警告を表示するためのプロジェクト固有の設定を有効にすることです。

ウィンドウ->設定-> Java->コンパイラ->エラー/警告

フォームの上部には、プロジェクト固有の設定を構成するためのリンクがあります。

7
jjnguy

ユーザー@Jornは、これを行うためにAntコードを示唆しました。ここに私が持っているものがあります

<echo>Adding @SuppressWarnings("all") to ANTLR generated parser/lexer *.Java</echo>
<echo> in ${project.build.directory}/generated-sources/antlr/</echo>
<replace dir="${project.build.directory}/generated-sources/antlr/" 
         summary="true" 
         includes="**/*.Java" 
         token="public class" 
         value='@SuppressWarnings("all") public class' />

Antの<replace>は正規表現の置換ではなくテキストの置換を行うため、maven regexp replaceプラグインのようにトークンの^メタ文字を使用して行の先頭に一致させることはできません。

ANTLR mavenプラグインがCobertura mavenプラグインとうまく動作しなかったため、Maven pomでmaven-antrun-pluginからAntlrを実行するのと同時にこれを行っています。

(これは元の質問への回答ではないことを理解していますが、Antコードをコメント/別の回答への返信でフォーマットすることはできません。回答のみです)

4
djb

私は、Eclipseがディレクトリレベルでこれを行う方法を本質的に提供するとは思わない(しかし、私にはわからない)。

生成されたファイルを別のJavaプロジェクトに入れて、その特定のプロジェクトの警告を制御することができます。

とにかく、私は通常、自動生成されたコードを別のプロジェクトに配置することを好みます。

1
Uri

プロジェクトレベルでのみ警告を抑制することができます。ただし、問題タブを設定して、ファイルまたはパッケージからの警告を抑制することができます。 [コンテンツの構成]メニューに移動し、[作業セット上:]スコープを操作します。

1
Greg

この小さなpythonスクリプトは、M2Eで生成された.classpathファイルを「パッチ」し、target/generated-sourcesで始まるすべてのソースフォルダーに必要なXMLタグを追加します。プロジェクトのルートフォルダーです。明らかに、Eclipseプロジェクト情報がM2Eから再生成されるときに、それを再実行する必要があります。

#!/usr/bin/env python
from xml.dom.minidom import parse
import glob
import os

print('Reading .classpath files...')
for root, dirs, files in os.walk('.'):
    for name in files:
        if (name == '.classpath'):
            classpathFile = os.path.join(root, name)
            print('Patching file:' + classpathFile)
            classpathDOM = parse(classpathFile)
            classPathEntries = classpathDOM.getElementsByTagName('classpathentry')
            for classPathEntry in classPathEntries:
                if classPathEntry.attributes["path"].value.startswith('target/generated-sources'):
                    # ensure that the <attributes> tag exists
                    attributesNode = None;
                    for attributes in classPathEntry.childNodes:
                            if (attributes.nodeName == 'attributes'):
                                attributesNode = attributes

                    if (attributesNode == None):
                        attributesNode = classpathDOM.createElement('attributes')
                        classPathEntry.appendChild(attributesNode)

                    # search if the 'ignore_optional_problems' entry exists
                    hasBeenSet = 0
                    for node in attributesNode.childNodes:
                        if (node.nodeName == 'attribute' and node.getAttribute('name') == 'ignore_optional_problems'):
                            # it exists, make sure its value is true
                            node.setAttribute('value','true')
                            #print(node.getAttribute('name'))
                            hasBeenSet = 1

                    if (not(hasBeenSet)):
                        # it does not exist, add it
                        x = classpathDOM.createElement("attribute")
                        x.setAttribute('name','ignore_optional_problems')
                        x.setAttribute('value','true')
                        attributesNode.appendChild(x)

            try:
                f = open(classpathFile, "w") 
                classpathDOM.writexml(f)
                print('Writing file:' + classpathFile)
            finally:
                f.close()
print('Done.')
1
opajonk

Antを使用してJavaパーサーを生成します。Antビルドスクリプトは@SuppressWarnings("all")を1つのJavaファイル、および@Override別のいくつかのメソッドに。あなたが興味を持っているなら、私はそれが正確に行われた方法を調べることができます。

1
Jorn

これは、ビルドパスから特定のディレクトリを除外することで実行できます(次の例は、Eclipse 3.5を使用して与えられます)

[1] Java Build Path

  • パッケージエクスプローラーでプロジェクトをクリックします
  • 右クリック、プロパティ
  • Java Build Path

[2]除外するディレクトリを追加します

  • [ソース]タブには、プロジェクトソースフォルダーの詳細が含まれている必要があります。
  • ソースフォルダーを展開し、「Excluded:」プロパティを見つけます
  • 「除外:」を選択して、「編集」をクリックします
  • 複数の追加/追加オプションを使用して、除外パターンにフォルダーを追加します
  • [完了]をクリックし、Eclipseを再構築します。
0
Darren

警告クリーナープラグインをリリースしてからしばらく経ちましたが、Eclipse 3.8を使用しているので、もう必要ありません。ただし、まだこのプラグインが必要な人のために、githubでbintrayの更新サイトと共にリリースしました。まだEclipse 3.7以前を使用している場合、これは便利です。インストールの詳細については、 このサイト を確認してください。

0
Marc

ANTLR 2の場合、文法ファイルのクラス宣言の前に@SuppressWarningsを追加することにより、生成されたコードの警告を抑制することができます。

{@SuppressWarnings("all")} class MyBaseParser extends Parser;
0