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


110

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


回答:


91

バージョン3.8 M6以降、Eclipse(正確にはJDT)には、このための機能が組み込まれています。プロジェクトのビルドパスを使用して構成できます。プロジェクトのプロパティ> Javaビルドパス>コンパイラ>ソース

ここに画像の説明を入力してください

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


2
「いいえ」->「はい」を切り替える方法が見つかりませんでした...「切り替え」ボタンです(編集しないでください);-)
Betlista

@Betlista:ダブルクリックするだけです。または、右側のトグルボタンをクリックします。
altumano

1
@hheimbuerger:このソリューションはソースフォルダーに対してのみ機能します。しかし、いくつかの不正なXMLファイルを含むフォルダーがプロジェクトにある場合はどうなりますか?私はそれらについての警告を見るのが嫌いです:(
altumano

@altumano上記の機能/オプションはJDTプラグイン、つまりEclipseのJavaサポートに由来します。(Eclipseのほとんどすべてがプラグインであることを思い出してください。Javaサポートも組み込まれていません。)したがって、XML検証を実行するために使用するプラグインの開発者に確認する必要があります。IIRC、多数ありますので、おそらくあなたが使用している質問に対して新しい質問を開く必要があります。
Henrik Heimbuerger、2012年

+1。ちなみに、どのOSを使いましたか?フォントのレンダリングはかなり奇妙です。
表示名

20

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

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

とても簡単です。

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

警告クリーナーのスクリーンショット


残念ながら、プラグインへのリンクは403を提供します
Kutzi

1
コア実装に向けて(バグのコメントを読んで)まだ進んでいるようです。機能が実装されている場合は、特定のバージョン番号を使用するように質問/回答を更新してください。そうしないと、Eclipseの将来のユーザーが混乱する可能性があります。
クリスブラウン'25年

1
機能がまだ存在していないため、質問/回答を現在改善できるとは思いませんが、機能がEclipseに追加された場合は、誰かがこれを編集する必要があります。必ずしも私とは限りませんが、適切なタイミングで適切な場所にいる場合は、もちろんそうします。
Chris Browne

5
誰かがこのプラグインへの現在のリンクを持っていますか?使えるようになりたいです!
トムトレサンスキー、2012年

1
注意:hheimbuergerからの他の回答でわかるように、Eclipseにはこのための組み込みソリューションがあります。ちなみに、hheimbuergerさんは、この回答を最新の情報でリファクタリングして「公式」にする必要があります。
Roberto

18

私は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を生成しない方法の改善については、以下のコメントを参照してください


Mavenは言及されていなかったので、これは必ずしも質問に答えるものではありません。しかし、私はMavenを使用しているため、私の場合は
うまく機能し

Mavenの代わりにAntを使用している場合も同じことができます。私の答えを参照してください。
ジョーン

1
ANTLR 3.4はそれ自体で注釈を追加するようですが、私はソリューションの一般性が好きです(ANTLRだけがコードを生成するのではありません)。生成されたすべてのソースに引き続き適用するには、次のパターンを使用します^(@SuppressWarnings\(.*?\)\s+)?public class。アノテーションをパターンに含めることにより、すでにそこにある場合は複製されません。
Silly Freak

これは(多かれ少なかれ)私にとってはうまくいった-私は${basedir}/以前target<include>タグに追加しなければならなかった。少しぎこちない感じがしますが、生成されたファイルでしか機能しないため、私はそれを採用します!
Rob

7

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

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

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


4

ユーザー@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コードをフォーマットしたり、別の回答に返信したりすることはできません。回答内でのみ)


1

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

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

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


1

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


[コンテンツの構成]メニューは私には意味がありません。
Chris Conway、

あなたはそれを見つけることができないか、あなたがそれにナビゲートする場所がわからないのですか?私はEclipse 3.4.1を使用しています(PyDevを追加したGanymedeインストールだと思います)。小さな矢印アイコンをクリックしてそのタブのメニューをドロップダウンすると、[問題]タブの右上隅に表示されます。
グレッグ

私はそれを見つけることができます。ダイアログの設定を変更するとどうなるかわかりません。
Chris Conway、

私はこれがどのように機能するかを見ることができますが、その場合、一般的な解決策ではないワーキングセットを使用する必要があります。ワーニングセットを更新して適切な警告を表示する必要があるため、問題が追加されます。
Peter Dolberg、2012年

1

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


面白いアイデア。@SuppressWarningsはクラス宣言の直前に来る必要はありませんか(つまり、ファイルの最初の行に挿入するほど簡単ではありません)。
Chris Conway、

そこに配置する必要はありますが、実行可能です。適切な関数を見つけるには、antのドキュメントを深く掘り下げる必要がありましたが、Antに関する経験はあまりありません。
ジョーン

ANTLR Java codegenテンプレートの変更方法については、antlr.org / wiki / pages / viewpage.action?pageId = 1865を参照してください。ただし、Eclipse用のANTLRプラグインを使用する場合にそれを機能させる方法は明確ではありません。私は、プラグインjarをハッキングするか、上記にリストされた他の回避策の1つを使用することに残っていると思います。
djb

1

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

#!/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.')

0

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

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

0

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

して提供されています) [1] Javaビルドパスを表示します

  • パッケージエクスプローラーのプロジェクトをクリックします。
  • 右クリック、プロパティ
  • Javaビルドパスを選択

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

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

0

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


0

EclipseプロジェクトがEclipseプラグインの eclipseコマンドを使用してGradleから生成されているSelectively ignore errors/warnings from source folders場合、オプションを設定するには、build.gradleファイルの最上位にこれを追加します。

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.each { entry -> 
            if (entry.path.contains('build/generated/parser')) {
                entry.entryAttributes['ignore_optional_problems'] = true
            }
        }
    }
}

これは、生成されたソースがbuild/generated/parserフォルダーにあることを前提としています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.