113

我正在使用一个解析器生成器,它创建了一些难看的代码。结果,我的 Eclipse 项目有几十个从生成的源文件发出的警告。我知道我可以使用@SuppressWarning注释来抑制特定元素中的特定警告,但是当解析器生成器再次运行时,我手动添加的任何注释都将丢失。有没有办法配置 Eclipse 来抑制特定文件或目录的警告?

4

13 回答 13

96

从版本 3.8 M6 开始,Eclipse(准确地说:JDT)为此提供了内置功能。它可以通过项目的构建路径进行配置:项目属性 > Java 构建路径 > 编译器 > 源代码

在此处输入图像描述

在此宣布:Eclipse 3.8 and 4.2 M6 - New and Noteworthy,称为Selectively ignore errors/warnings from source folder。这也是截图的来源。这是在之前链接的Bug 220928上开发的新功能。

于 2012-03-23T07:42:01.247 回答
20

对此有一张票,即Bug 220928,该票已针对 Eclipse 3.8 完成。有关详细信息,请参阅此答案

如果您坚持使用 Eclipse 3.7 或更低版本:评论该票证的用户“Marc”在评论 35中创建(或至少链接到)一个名为“warningcleaner”的插件。在等待将此功能集成到 Eclipse 中时,我使用它取得了很大的成功。

这真的很简单:

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

警告清洁器屏幕截图

于 2011-01-25T15:52:11.563 回答
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 的改进,请参阅下面的评论

于 2010-09-20T09:02:36.337 回答
7

我认为您能做的最好的事情是启用项目特定设置以显示警告。

窗口 -> 首选项 -> Java -> 编译器 -> 错误/警告

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

于 2009-07-14T20:49:28.793 回答
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 插件那样使用标记中的 ^ 元字符来匹配行首。

我这样做的同时,我在我的 Maven pom 中从 maven-antrun-plugin 运行 Antlr,因为 ANTLR maven 插件不能很好地与 Cobertura maven 插件配合使用。

(我意识到这不是原始问题的答案,但我无法在评论/回复另一个答案中格式化 Ant 代码,只能在答案中)

于 2011-05-09T19:05:37.680 回答
1

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

您可以将生成的文件放入单独的 Java 项目中,并控制该特定项目的警告。

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

于 2009-07-14T20:49:54.020 回答
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.')
于 2013-02-19T09:40:00.480 回答
1

您只能在项目级别禁止警告。但是,您可以配置问题选项卡以禁止来自文件或包的警告。进入“配置内容”菜单并使用“工作集:”范围。

于 2009-07-14T20:51:38.963 回答
0

自从我发布警告清理插件以来已经有一段时间了,现在我使用的是 Eclipse 3.8,我不再需要它了。但是,对于那些仍然需要这个插件的人,我已经在 github 上发布了它,并在 bintray 上提供了更新站点。如果您仍在使用 Eclipse 3.7 或更早版本,这可能很有用。检查此站点以获取安装详细信息。

于 2014-04-21T12:44:15.083 回答
0

我正在对一些 ANTLR 语法执行此操作,这些语法使用 Ant 生成 Java 解析器。Ant 构建脚本将其添加@SuppressWarnings("all")到一个 Java 文件中,并添加到@Override另一个中的一些方法中。如果你有兴趣,我可以看看它是如何完成的。

于 2009-07-14T21:46:34.653 回答
0

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

{@SuppressWarnings("all")} class MyBaseParser extends Parser;
于 2010-07-30T10:23:59.673 回答
0

这可以通过从构建路径中排除某些目录来完成(以下示例是使用 Eclipse 3.5 给出的)

[1] 启动 Java 构建路径

  • 点击Package Explorer中的project
  • 右键,属性
  • 选择 Java 构建路径

[2] 添加要排除的目录

  • 源选项卡应包含项目源文件夹的详细信息
  • 展开源文件夹并找到“排除:”属性
  • 选择“排除:”并单击编辑
  • 使用添加/添加多个选项将文件夹添加到排除模式中
  • 单击完成,然后确定 Eclipse 以重建。
于 2012-01-03T16:06:57.340 回答
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文件夹中。

于 2020-06-05T19:48:28.637 回答