如何抑制特定目录或文件(例如生成的代码)的Java警告


110

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


Answers:


91

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

在此处输入图片说明

此处宣布:Eclipse 3.8和4.2 M6-全新且值得注意,称为“ 选择性忽略源文件夹中的错误/警告”。这也是屏幕截图的来源。这是先前链接的Bug 220928上开发的新功能。


2
我找不到如何切换“否”->“是” ...这是“切换”按钮(并且不进行编辑或其他操作);-)
Betlista 2012年

@Betlista:双击它。或单击右侧的切换按钮。
altumano

1
@hheimbuerger:此解决方案仅适用于源文件夹。但是,如果我在项目中只有一个文件夹,其中包含一些格式错误的XML文件,该怎么办?我讨厌看到有关它们的警告:(
altumano

@altumano上面的功能/选项来自JDT插件,即Java对Eclipse的支持。(请记住,Eclipse中的几乎所有东西都是一个插件,即使Java支持也没有得到体现。)因此,您必须与用于XML验证的插件开发者联系。IIRC,有很多,所以您可能应该专门针对正在使用的问题提出一个新问题。
Henrik Heimbuerger

+1。顺便问一下,您使用了哪个操作系统?字体渲染很奇怪。
显示名称

20

此后有一张票证Bug 220928,此票证已针对Eclipse 3.8完成。请参阅此答案以获取详细信息。

如果你坚持使用Eclipse 3.7或更低:用户“马克”评论创建的票(或至少指向)一个名为“warningcleaner”插件评论35。在等待将此功能集成到Eclipse时,我已经成功地使用了它。

这真的很简单:

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

Warning Cleaner屏幕截图


不幸的是,该插件的链接现在为403
Kutzi 2011年

1
似乎在实现核心实现方面仍在取得进展(阅读有关错误的注释)。如果已实现该功能,请确保更新问题/答案以使用特定的版本号。否则,将来的Eclipse用户可能会感到困惑。
克里斯·布朗

1
由于功能尚不存在,我认为问题/答案目前尚无法改进,但是如果该功能曾经被添加到eclipse中,则应由他人对其进行编辑。不一定是我,但是如果我在正确的时间到达正确的位置,那我当然会这么做。
克里斯·布朗

5
有人有这个插件的当前链接吗?我希望能够使用它!
汤姆·特雷桑斯基

1
注意:Eclipse现在为此提供了一个内置解决方案,您可以在hheimbuerger的另一个答案中看到。顺便说一句,hheimbuerger,您应该使用更新的信息来重构此答案,使其成为“官方”文件。
罗伯托2012年

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 ;-)
库奇(Kutzi)2010年

如果您使用的是Ant而不是Maven,则可以完成相同的操作,请参阅我的答案。
乔恩

1
似乎ANTLR 3.4本身会添加注释,但是我喜欢解决方案的通用性(不仅ANTLR会生成代码)。仍将其应用于所有生成的源,我使用以下模式:^(@SuppressWarnings\(.*?\)\s+)?public class。通过在模式中包含注释,就不会重复注释。
傻家伙

这(或多或少)为我工作-我不得不添加${basedir}/之前target<include>标签。感觉有点简陋,但由于它仅适用于生成的文件,所以我接受它!
罗布

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插件那样使用令牌中的^元字符来匹配行首。

在执行此操作的同时,我从Maven pom中的maven-antrun-plugin运行Antlr,因为ANTLR maven插件不能与Cobertura maven插件配合使用。

(我意识到这不是原始问题的答案,但是我无法在注释/答复其他答案中格式化Ant代码的格式,只能在答案中)


1

我不认为Eclipse固有地提供了在目录级别执行此操作的方法(但我不确定)。

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

我通常还是喜欢将自动生成的代码放在单独的项目中。


1

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


“配置目录”菜单对我没有任何意义。
克里斯·康威

您找不到它,或者找不到在哪里导航?我正在使用Eclipse 3.4.1(我认为这是添加了PyDev的Ganymede安装)。单击小箭头图标以下拉该选项卡的菜单时,它位于“问题”选项卡的右上角。
格雷格,

我可以找到它。我不知道在该对话框中更改设置会完成什么。
克里斯·康威

我可以看到它是如何工作的,但是您必须使用工作集,这不是通用的解决方案。它增加了问题,因为现在您必须更新工作集才能看到正确的警告。
彼得·多尔伯格

1

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


一个有趣的想法。@SuppressWarnings是否不需要紧接在类声明之前(即,它不像在文件的第一行插入一样容易)?
克里斯·康威

它确实需要放置在此处,但它是可行的。我需要深入研究ant文档来找到合适的功能,但是我对Ant并没有太多的经验。
乔恩

请参阅antlr.org/wiki/pages/viewpage.action?pageId=1865,其中介绍了如何修改ANTLR Java代码生成模板。但是,当使用ANTLR Eclipse插件时,如何使其工作尚不清楚。我猜剩下一个可以破解插件jar或使用上面列出的其他解决方法之一。
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

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

[1]调出Java构建路径

  • 在Package Explorer中单击项目
  • 右键单击,属性
  • 选择Java构建路径

[2]添加要排除的目录

  • Source选项卡应包含项目源文件夹的详细信息
  • 展开源文件夹并找到“排除:”属性
  • 选择“排除:”,然后单击“编辑”。
  • 使用“添加/添加多个”选项将文件夹添加到排除模式中
  • 单击完成,然后单击确定以重新构建Eclipse。

0

自从我发布了警告清理器插件已经有一段时间了,而现在我正在使用Eclipse 3.8,所以我不再需要它了。但是,对于仍需要此插件的用户,我已在github上的Bintray更新站点上发布了它。如果您仍在使用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文件夹中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.