Как подавить предупреждения Java для определенных каталогов или файлов, таких как сгенерированный код - PullRequest
109 голосов
/ 15 июля 2009

Я использую генератор парсера, который создает некрасивый код. В результате мой проект Eclipse имеет несколько десятков предупреждений, исходящих из сгенерированных исходных файлов. Я знаю, что могу использовать аннотацию @SuppressWarning для подавления определенных предупреждений в определенных элементах, но любые аннотации, которые я добавляю вручную, будут потеряны при повторном запуске генератора синтаксического анализа. Есть ли способ настроить Eclipse для подавления предупреждений для определенного файла или каталога?

Ответы [ 12 ]

88 голосов
/ 23 марта 2012

Начиная с версии 3.8 M6, Eclipse (а точнее - JDT) имеет встроенную функциональность для этого. Это настраивается через путь сборки проекта: Свойства проекта> Путь сборки Java> Компилятор> Источник

enter image description here

Объявлено здесь: Eclipse 3.8 и 4.2 M6 - новые и заслуживающие внимания , называемые Выборочно игнорировать ошибки / предупреждения из исходных папок . Вот откуда скриншот. Это новая функция, разработанная на ранее связанной Ошибка 220928 .

20 голосов
/ 25 января 2011

Для этого есть билет, Ошибка 220928 , который с тех пор был завершен для Eclipse 3.8. Пожалуйста, смотрите этот ответ для деталей.

Если вы застряли в Eclipse 3.7 или ниже: пользователь «Marc», комментирующий этот тикет, создал (или, по крайней мере, ссылки на него) плагин «warningcleaner» в comment 35 . Я использую это с большим успехом, ожидая интеграции этой функции в Eclipse.

Это действительно довольно просто:

  1. Установить плагин.
  2. Щелкните правой кнопкой мыши проект и выберите «Добавить / удалить сгенерированный код».
  3. Откройте настройки проекта (щелкните правой кнопкой мыши и выберите «Свойства»).
  4. Откройте вкладку «Очиститель предупреждений».
  5. Выберите исходные папки, из которых вы хотите игнорировать предупреждения.

Warning Cleaner screenshot

17 голосов
/ 20 сентября 2010

Я решил это с помощью плагина 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

7 голосов
/ 15 июля 2009

Я думаю, что лучшее, что вы можете сделать, - включить конкретные настройки проекта для отображения предупреждений.

Окно -> Настройки -> Java -> Компилятор -> Ошибки / предупреждения

В верхней части формы находится ссылка для настройки параметров проекта.

4 голосов
/ 09 мая 2011

Пользователь @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's выполняет замену текста, а не замену регулярного выражения, поэтому он не может использовать метасимвол ^ в токене для соответствия началу строки, как это делает плагин maven regexp replace.

Я делаю это в то же время, когда запускаю Antlr из maven-antrun-plugin в моем Maven pom, поскольку плагин ANTLR maven плохо работал с плагином Cobertura maven.

(я понимаю, что это не ответ на исходный вопрос, но я не могу отформатировать код Ant в комментарии / ответе на другой ответ, только в ответе)

1 голос
/ 19 февраля 2013

Этот небольшой скрипт на python «исправляет» сгенерированные M2E файлы .classpath и добавляет необходимый тег XML во все исходные папки, начиная с target/generated-sources. Вы можете просто запустить его из корневой папки вашего проекта. Очевидно, вам нужно перезапустить его, когда информация о проекте 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.')
1 голос
/ 15 июля 2009

Я делаю это с несколькими грамматиками ANTLR, которые генерируют синтаксический анализатор Java с использованием Ant. Сценарий сборки Ant добавляет @SuppressWarnings("all") в один файл Java и @Override в несколько методов в другом. Я могу посмотреть, как именно это делается, если вам интересно.

1 голос
/ 15 июля 2009

Вы можете подавлять предупреждения только на уровне проекта. Тем не менее, вы можете настроить вкладку ваших проблем для подавления предупреждений из файлов или пакетов. Перейдите в меню «Настроить содержимое» и работайте с областью «На рабочем наборе:».

1 голос
/ 15 июля 2009

Я не думаю, что Eclipse по сути предоставляет способ сделать это на уровне каталогов (но я не уверен).

Сгенерированные файлы могут быть помещены в отдельный проект Java и управлять предупреждениями для этого конкретного проекта.

Как правило, я все равно предпочитаю размещать автоматически сгенерированный код в отдельном проекте.

0 голосов
/ 21 апреля 2014

Прошло много времени с тех пор, как я выпустил плагин для очистки предупреждений, и теперь, когда я использую Eclipse 3.8, он мне больше не нужен. Однако для тех, кому все еще нужен этот плагин, я выпустил его на github с сайтом обновлений на bintray. Если вы все еще используете Eclipse 3.7 или более раннюю версию, это может быть полезно. Проверьте этот сайт для подробностей установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...