如何禁止特定目录或文件(如生成的代码)的Java警告

时间:2009-07-14 20:44:52

标签: java eclipse suppress-warnings generated-code

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

13 个答案:

答案 0 :(得分:88)

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

enter image description here

在此处宣布:Eclipse 3.8 and 4.2 M6 - New and Noteworthy,名为有选择地忽略来自源文件夹的错误/警告。这也是屏幕截图的来源。这是以前链接的Bug 220928开发的新功能。

答案 1 :(得分:20)

此版本的凭单Bug 220928已经为Eclipse 3.8完成了。有关详细信息,请参阅this answer

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

这真的很简单:

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

答案 2 :(得分:17)

我通过使用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

答案 3 :(得分:7)

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

  

窗口 - &gt;偏好 - &gt; Java - &gt;编译器 - &gt;错误/警告

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

答案 4 :(得分: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的&lt; replace&gt;文本替换,而不是正则表达式替换, 所以它不能使用令牌中的^元字符来匹配maven regexp replace插件所做的行首。

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

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

您只能在项目级别禁止警告。但是,您可以配置“问题”选项卡以禁止文件或包中的警告。进入Configure Contents菜单并使用“On working set:”范围。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

这个小小的python脚本&#34;补丁&#34; 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.')

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

[1]打开Java构建路径

  • 在Package Explorer中单击项目
  • 右键单击,属性
  • 选择Java Build Path

[2]添加要排除的目录

  • “源”选项卡应包含项目源文件夹的详细信息
  • 展开源文件夹并找到“Excluded:”属性
  • 选择“已排除:”,然后点击修改
  • 使用添加/添加多个选项
  • 将文件夹添加到排除模式中
  • 单击Finish,然后确定Eclipse重建。

答案 11 :(得分:0)

自从我发布了warning-cleaner插件以来已经有一段时间了,现在我正在使用Eclipse 3.8,我已经不再需要它了。 但是,对于那些仍然需要这个插件的人,我已经在github上发布了它与bintray上的更新站点。 如果您仍在使用Eclipse 3.7或之前,这可能很有用。 检查this site以获取安装详细信息。

答案 12 :(得分:0)

如果使用Eclipse plugin's eclipse命令从gradle生成eclipse项目,则可以通过在Selectively ignore errors/warnings from source folders文件的顶级添加以下内容来设置build.gradle选项:< / p>

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