私はやや醜いコードを作成するパーサー ジェネレーターを使用しています。その結果、私の Eclipse プロジェクトには、生成されたソース ファイルから発せられる数十の警告があります。@SuppressWarning
注釈を使用して特定の要素の特定の警告を抑制することができることはわかっていますが、手動で追加した注釈は、パーサー ジェネレーターが再度実行されると失われます。特定のファイルまたはディレクトリの警告を抑制するように Eclipse を構成する方法はありますか?
13 に答える
バージョン3.8M6以降、Eclipse(正確にはJDT)にはこのための機能が組み込まれています。プロジェクトのビルドパスを介して構成できます:プロジェクトのプロパティ>Javaビルドパス>コンパイラ>ソース
ここで発表:Eclipse3.8および4.2M6-新しく注目に値する、ソースフォルダからのエラー/警告を選択的に無視すると呼ばれる。スクリーンショットの出所でもあります。これは、以前にリンクされたバグ220928で開発された新機能です。
これに対するバグ 220928というチケットがあり、これはEclipse 3.8 で完了しています。詳細については、この回答を参照してください。
Eclipse 3.7 以下で立ち往生している場合: そのチケットについてコメントしているユーザー「Marc」は、コメント 35で「warningcleaner」というプラグインを作成 (または少なくともリンク) しています。この機能がEclipseに統合されるのを待っている間、私はそれを使用して多くの成功を収めています。
それは本当にとても簡単です:
- プラグインをインストールします。
- プロジェクトを右クリックし、[生成されたコードの性質を追加/削除] を選択します。
- プロジェクト設定を開きます (右クリックして [プロパティ] を選択します)。
- 「警告クリーナー」タブを開きます。
- 警告を無視するソース フォルダーを選択します。
私は 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 を生成しない方法の改善については、以下のコメントを参照してください。
あなたができる最善のことは、警告を表示するためのプロジェクト固有の設定を有効にすることだと思います。
ウィンドウ -> 設定 -> Java -> コンパイラ -> エラー/警告
フォームの上部には、プロジェクト固有の設定を構成するためのリンクがあります。
ユーザー@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プラグインのように、トークン内の^メタ文字を使用して行の先頭に一致させることはできません。
ANTLRmavenプラグインがCoberturamavenプラグインでうまく機能しなかったため、Mavenpomでmaven-antrun-pluginからAntlrを実行すると同時にこれを実行しています。
(これは元の質問に対する回答ではないことを認識していますが、コメント/別の回答への返信でAntコードをフォーマットすることはできず、回答のみで)
Eclipse が本質的にディレクトリ レベルでこれを行う方法を提供しているとは思いません (しかし、よくわかりません)。
生成されたファイルを別の Java プロジェクトに入れ、その特定のプロジェクトの警告を制御できます。
とにかく、自動生成されたコードを別のプロジェクトに配置することを一般的に好みます。
プロジェクト レベルでのみ警告を抑制することができます。ただし、問題タブを構成して、ファイルまたはパッケージからの警告を抑制することができます。Configure Contents メニューに移動し、「On working set:」スコープで作業します。
この小さな 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.')
これは、ビルド パスから特定のディレクトリを除外することで実行できます (次の例では Eclipse 3.5 を使用しています)
[1] Java ビルド パスを起動します。
- パッケージ エクスプローラーでプロジェクトをクリックします。
- 右クリック、プロパティ
- Java ビルド パスの選択
[2] 除外するディレクトリを追加
- [ソース] タブには、プロジェクト ソース フォルダーの詳細が含まれている必要があります。
- ソース フォルダーを展開し、「除外:」プロパティを見つけます。
- [除外:] を選択し、[編集] をクリックします。
- [追加/複数追加] オプションを使用して、フォルダーを除外パターンに追加します。
- [完了] をクリックしてから、Eclipse を再構築するために [OK] をクリックします。
ANTLR 2 の場合@SuppressWarnings
、文法ファイルのクラス宣言の前に追加することで、生成されたコードの警告を抑制することができます。
{@SuppressWarnings("all")} class MyBaseParser extends Parser;
warning-cleaner プラグインをリリースしてからしばらく経ちましたが、今では Eclipse 3.8 を使用しているため、もう必要ありません。ただし、このプラグインがまだ必要な方のために、bintray の更新サイトを使用して github でリリースしました。まだ Eclipse 3.7 以前を使用している場合、これは役立つ可能性があります。インストールの詳細については、このサイトを確認してください。