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

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

Ответ 1

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

enter image description here

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

Ответ 2

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

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

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

  • Установить плагин.
  • Щелкните правой кнопкой мыши проект и выберите "Добавить/удалить сгенерированный код".
  • Откройте настройки проекта (щелкните правой кнопкой мыши и выберите "свойства" ).
  • Откройте вкладку "Предупреждающий очиститель".
  • Выберите исходные папки, из которых вы хотите игнорировать предупреждения.

Warning Cleaner screenshot

Ответ 3

Я решил это, используя плагин замены maven 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>

Обратите внимание, что мне не удалось получить ** нотацию для работы, поэтому вам может потребоваться указать путь точно.

См. комментарий ниже для улучшения того, как не создавать повторяющиеся @SupressWarnings

Ответ 4

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

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

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

Ответ 5

Пользователь @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 делает.

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

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

Ответ 6

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

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

Я вообще предпочитаю размещать автоматически созданный код в отдельном проекте.

Ответ 7

Вы можете подавлять предупреждения только на уровне проекта. Однако вы можете настроить вкладку проблем, чтобы подавлять предупреждения из файлов или пакетов. Перейдите в меню "Конфигурация содержимого" и работайте с областью "On working set:".

Ответ 8

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

Ответ 9

В случае ANTLR 2 можно подавить предупреждения в сгенерированном коде appenidng @SuppressWarnings перед объявлением класса в файле грамматики, например.

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

Ответ 10

Это можно сделать, исключив определенные каталоги из пути сборки (следующий пример приведен с использованием Eclipse 3.5)

[1] Поднять путь сборки Java

  • Нажмите "Проводник пакетов"
  • Щелкните правой кнопкой мыши, свойства
  • Выберите путь сборки Java.

[2] Добавить каталоги для исключения

  • Вкладка "Источник" должна содержать сведения об исходных папках проекта
  • Разверните папку-источник и найдите свойство "Исключено:"
  • Выберите "Исключено:" и нажмите "Изменить"
  • Добавление папок в шаблоны исключения с использованием опций добавления/добавления нескольких
  • Нажмите "Готово", затем "ОК" для восстановления Eclipse.

Ответ 11

Этот маленький python script "исправляет" созданные 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.')

Ответ 12

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