How to suppress Java warnings for specific directories or files such as generated code

我用的编译器编译程式代码有点难看。因此,我的 Eclipse 项目有几十个来自生成的源文件的警告。我知道我可以使用 @SuppressWarning注释来抑制特定元素中的特定警告,但是当编译器编译程式再次运行时,我手工添加的任何注释都将丢失。是否有办法将 Eclipse 配置为禁止显示针对特定文件或目录的警告?

37794 次浏览

我认为最好的办法是启用特定于项目的设置来显示警告。

Window -> Preferences -> Java -> Compiler -> Errors/Warnings

表单顶部有一个用于配置项目特定设置的链接。

我不认为 Eclipse 本身提供了一种在目录级别执行此操作的方法(但我不确定)。

You could have the generated files go into a separate Java project, and control warnings for that specific project.

无论如何,我通常更喜欢将自动生成的代码放在单独的项目中。

You can only suppress warnings at the project level. However, you can configure your problems tab to suppress warnings from files or packages. Go into the Configure Contents menu and work with the "On working set:" scope.

我正在对一些 ANTLR 语法执行此操作,它们使用 Ant 生成一个 Java 解析器。Ant 构建脚本将 @SuppressWarnings("all")添加到一个 Java 文件中,将 @Override添加到另一个 Java 文件中的几个方法中。 如果你感兴趣的话,我可以查查具体是怎么做的。

对于 ANTLR 2,可以通过在语法文件中的类声明之前附加 @SuppressWarnings来抑制生成代码中的警告,例如。

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

我通过使用专业的 regexp 替换插件解决了这个问题——它不能解决问题,但能治愈痛苦:

<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>

注意,我没有设法让 * * 符号起作用,因此您可能必须精确地指定 path。

有关如何不生成重复@SupressWarnings 的改进,请参见下面的注释

这里有一张票,Bug 220928,已经在 Eclipse 3.8中完成了。请参阅 这个答案了解详细信息。

If you're stuck with Eclipse 3.7 or lower: The user "Marc" commenting on that ticket created (or at least links to) a plugin called 'warningcleaner' in 意见35. I'm using that with a lot of success while waiting for this feature to be integrated into Eclipse.

其实很简单:

  1. 安装插件。
  2. 右键单击 project 并选择“添加/删除生成的代码性质”。
  3. 打开项目设置(右键单击并选择“ properties”)。
  4. 打开“警告清洁器”选项卡。
  5. 选择要忽略来自的警告的源文件夹。

Warning Cleaner screenshot

User@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 的 < place > 做的是文本替换,而不是正则表达式替换, 所以它不能使用标记中的 ^ 元字符来匹配行首,就像 maven regexp place 插件所做的那样。

我这样做的同时,我从 Maven-antrun-plugin 在我的 Maven pom 中运行 ANTLR,因为 ANTLR Maven 插件在 Cobertura Maven 插件中运行不好。

(我知道这不是最初问题的答案,但是我不能在对另一个答案的注释/回复中格式化 Ant 代码,只能在一个答案中)

This can be done by excluding certain directories from the build path (The following example is given using Eclipse 3.5)

[1]调出 Java 构建路径

  • 单击 PackageExplorer 中的项目
  • Right click, properties
  • 选择 JavaBuild 路径

[2] Add directories to exclude

  • Source 选项卡应包含项目源文件夹的详细信息
  • 展开源文件夹并找到“ Exclused:”属性
  • 选择“排除:”并单击“编辑”
  • Add folders into the Exclusion patterns using the Add/Add Multiple options
  • Click Finish, then ok for Eclipse to rebuild.

从版本3.8 M6开始,Eclipse (确切地说是 JDT)为此提供了内置功能。它可以通过项目的构建路径 Project properties > Java Build Path > Compiler > Source进行配置

enter image description here

这里宣布: Eclipse 3.8和4.2 M6-新的和值得注意的,称为 选择性忽略来自源文件夹的错误/警告。这也是截图的来源。这是在先前连接的 Bug 220928上开发的新特性。

这个小的 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.8,我不再需要它了。 However, for those who still need this plugin, I have released it on github with the update site on bintray. 如果您仍然在使用 Eclipse 3.7或之前的版本,这可能会很有用。 有关安装详细信息,请检查 this site

如果 Eclipse 项目是使用 Eclipse 插件的 eclipse命令从 gradle 生成的,那么可以通过在 build.gradle文件的顶层添加这个选项来设置 Selectively ignore errors/warnings from source folders选项:

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文件夹中。