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

110

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

Крис Конвей
источник
Относится к stackoverflow.com/questions/230199/…
Gray

Ответы:

91

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

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

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

Хенрик Хеймбюргер
источник
2
Я не мог найти, как переключить "Нет" -> "Да" ... это кнопка "Переключить" (а не редактировать или что-то еще) ;-)
Betlista 02
@Betlista: Просто дважды щелкните по нему. Или нажмите кнопку переключения справа.
altumano 02
1
@hheimbuerger: это решение работает только для исходных папок. Но что, если у меня в проекте есть папка, содержащая некорректные файлы XML? Ненавижу предупреждения о них :(
altumano
@altumano Вышеупомянутая функция / опция исходит от подключаемого модуля JDT, т.е. поддержки Java для Eclipse. (Помните, что почти все в Eclipse - это подключаемые модули, даже поддержка Java не встроена.) Поэтому вам придется обратиться к разработчику подключаемого модуля, который вы используете для проверки XML. IIRC, их много, поэтому вам, вероятно, следует открыть новый вопрос специально для того, который вы используете.
Henrik Heimbuerger
+1. Кстати, какую ОС вы использовали? Рендеринг шрифтов довольно странный.
Отображаемое имя
20

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

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

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

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

Скриншот программы Warning Cleaner

Хенрик Хеймбюргер
источник
К сожалению, ссылка на плагин сейчас дает 403
Куци
1
Похоже, что прогресс все еще идет (читая комментарии к ошибке) в направлении основной реализации. Обязательно обновите вопрос / ответ, чтобы использовать конкретные номера версий, если функция реализована. В противном случае будущие пользователи Eclipse могут быть сбиты с толку.
Крис Браун,
1
Я не чувствую, что вопрос / ответ в настоящее время можно улучшить, поскольку функциональность еще не существует, но если функциональность когда-либо добавляется в eclipse, кто-то должен это отредактировать. Не обязательно я, но если я окажусь в нужном месте в нужное время, то, конечно, сделаю это.
Крис Браун,
5
Есть ли у кого-нибудь актуальная ссылка на этот плагин? Я бы хотел иметь возможность его использовать!
Том Тресанский
1
Внимание: Eclipse теперь имеет встроенное решение для этого, как вы можете видеть в другом ответе от hheimbuerger. Кстати, hheimbuerger, вам следует реорганизовать этот ответ, добавив обновленную информацию, чтобы сделать его «официальным».
Роберто
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.

Knubo
источник
Поскольку Maven не упоминался, это не обязательно отвечает на вопрос. Но в моем случае он отлично работает, так как я использую Maven ;-)
Куци
То же самое можно сделать, если вы используете Ant вместо Maven, см. Мой ответ.
Йорн
1
кажется, что ANTLR 3.4 добавляет аннотацию сам по себе, но мне нравится общность решения (код генерирует не только ANTLR). Чтобы еще применить его ко всем сгенерированным источникам, я использую этот шаблон: ^(@SuppressWarnings\(.*?\)\s+)?public class. Включая аннотацию в шаблон, она не дублируется, если она уже есть.
Silly Freak
Это (более или менее) сработало для меня - я должен был добавить ${basedir}/раньше targetв <include>теге. Похоже на неприятности, но поскольку он работает только с сгенерированными файлами, я его возьму!
Роб
7

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

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

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

jjnguy
источник
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' />

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

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

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

DJB
источник
1

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

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

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

Ури
источник
1

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

Greg
источник
Меню «Настроить содержимое» для меня не имеет никакого смысла.
Крис Конвей,
Вы не можете его найти или не можете понять, где в нем перемещаться? Я использую Eclipse 3.4.1 (я думаю, что это установка Ganymede с добавленным PyDev). Он расположен в верхнем правом углу вкладки «Проблемы», когда вы щелкаете значок маленькой стрелки, чтобы раскрыть меню для этой вкладки.
Грег,
Я найду это. Я не понимаю, к чему приведет изменение настроек в этом диалоговом окне.
Крис Конвей,
Я вижу, как это может работать, но тогда вам придется использовать рабочие наборы, что не является универсальным решением. Это усугубляет проблему, потому что теперь вам нужно обновить свой рабочий набор, чтобы увидеть правильные предупреждения.
Питер Дольберг
1

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

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

Йорн
источник
Интересная идея. Разве @SuppressWarnings не нужно указывать непосредственно перед объявлением класса (т.е. это не так просто, как вставить его в первую строку файла)?
Крис Конвей,
Его действительно нужно разместить там, но это выполнимо. Мне нужно было углубиться в документацию по ant, чтобы найти правильную функцию, но у меня нет большого опыта работы с Ant.
Jorn
См. Antlr.org/wiki/pages/viewpage.action?pageId=1865, в котором описано, как изменить шаблон кодогенерации ANTLR Java. Однако неясно, как это сделать при использовании подключаемого модуля ANTLR для Eclipse. Я предполагаю, что остается один взломать jar плагина или использовать один из других обходных путей, перечисленных выше.
djb
0

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

{@SuppressWarnings("all")} class MyBaseParser extends Parser;
Мануэль Бернхардт
источник
0

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

[1] Откройте путь сборки Java

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

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

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

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

Марк
источник
0

Если проект затмения генерируется из Gradle с помощью Eclipse Plugin в eclipse команде в 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папке.

Роман Коновал
источник