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

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

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

    введите описание изображения здесь

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

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

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

    Это очень просто:

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

    Снимок экрана Cleaner

    Я решил это, используя плагин замены maven regexp – он не решает причину, но исцеляет боль:

      com.google.code.maven-replacer-plugin maven-replacer-plugin 1.3.2   prepare-package  replace      target/generated-sources/antlr/**/*.java  true  MULTILINE    ^public class @SuppressWarnings("all") public class     в  com.google.code.maven-replacer-plugin maven-replacer-plugin 1.3.2   prepare-package  replace      target/generated-sources/antlr/**/*.java  true  MULTILINE    ^public class @SuppressWarnings("all") public class     

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

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

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

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

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

    Пользователь @Jorn намекнул на код Ant, чтобы сделать это. Вот что у меня есть

     Adding @SuppressWarnings("all") to ANTLR generated parser/lexer *.java  in ${project.build.directory}/generated-sources/antlr/  в Adding @SuppressWarnings("all") to ANTLR generated parser/lexer *.java  in ${project.build.directory}/generated-sources/antlr/  

    Обратите внимание, что Ant выполняет замену текста, а не замену регулярного выражения, поэтому он не может использовать метасимвол в токене, чтобы соответствовать началу строки, как это делает плагин замены maven regexp.

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

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

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

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

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

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

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

    Этот небольшой скрипт python «исправляет» созданные .classpath файлы .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  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.') 

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

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

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

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

    • Нажмите на Projectin Package Explorer
    • Щелкните правой кнопкой мыши, свойства
    • Выберите путь сборки Java

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

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

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

    Давайте будем гением компьютера.