ややsomewhatいコードを作成するパーサージェネレーターを使用しています。その結果、私のEclipseプロジェクトには、生成されたソースファイルから発生する数十の警告があります。 @SuppressWarning
アノテーションを使用して特定の要素の特定の警告を抑制することができますが、パーサージェネレーターを再度実行すると、手動で追加したアノテーションは失われます。特定のファイルまたはディレクトリの警告を抑制するようにEclipseを構成する方法はありますか?
バージョン3.8 M6以降、Eclipse(正確にはJDT)にはこの機能が組み込まれています。プロジェクトのビルドパスを通じて構成可能です:Project properties> Java Build Path> Compiler> Source
ここで発表: Eclipse 3.8 and 4.2 M6-New and Noteworthy 、calledソースフォルダーからのエラー/警告を選択的に無視します。また、そこからスクリーンショットがあります。これは、以前にリンクされた Bug 220928 で開発された新しい機能です。
このチケットは Bug 220928 であり、Eclipse 3.8で完成しました。詳細については この回答 をご覧ください。
Eclipse 3.7以前で止まっている場合:そのチケットにコメントするユーザー「Marc」が comment 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プラグインのようにトークンの^メタ文字を使用して行の先頭に一致させることはできません。
ANTLR mavenプラグインがCobertura mavenプラグインとうまく動作しなかったため、Maven pomでmaven-antrun-pluginからAntlrを実行するのと同時にこれを行っています。
(これは元の質問への回答ではないことを理解していますが、Antコードをコメント/別の回答への返信でフォーマットすることはできません。回答のみです)
私は、Eclipseがディレクトリレベルでこれを行う方法を本質的に提供するとは思わない(しかし、私にはわからない)。
生成されたファイルを別のJavaプロジェクトに入れて、その特定のプロジェクトの警告を制御することができます。
とにかく、私は通常、自動生成されたコードを別のプロジェクトに配置することを好みます。
プロジェクトレベルでのみ警告を抑制することができます。ただし、問題タブを設定して、ファイルまたはパッケージからの警告を抑制することができます。 [コンテンツの構成]メニューに移動し、[作業セット上:]スコープを操作します。
この小さな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.')
Antを使用してJavaパーサーを生成します。Antビルドスクリプトは@SuppressWarnings("all")
を1つのJavaファイル、および@Override
別のいくつかのメソッドに。あなたが興味を持っているなら、私はそれが正確に行われた方法を調べることができます。
これは、ビルドパスから特定のディレクトリを除外することで実行できます(次の例は、Eclipse 3.5を使用して与えられます)
[1] Java Build Path
[2]除外するディレクトリを追加します
警告クリーナープラグインをリリースしてからしばらく経ちましたが、Eclipse 3.8を使用しているので、もう必要ありません。ただし、まだこのプラグインが必要な人のために、githubでbintrayの更新サイトと共にリリースしました。まだEclipse 3.7以前を使用している場合、これは便利です。インストールの詳細については、 このサイト を確認してください。
ANTLR 2の場合、文法ファイルのクラス宣言の前に@SuppressWarnings
を追加することにより、生成されたコードの警告を抑制することができます。
{@SuppressWarnings("all")} class MyBaseParser extends Parser;