Я использую генератор парсера, который создает несколько уродливый код. В результате мой проект Eclipse содержит несколько десятков предупреждений, исходящих из сгенерированных исходных файлов. Я знаю, что я могу использовать аннотацию @SuppressWarning
для подавления конкретных предупреждений в определенных элементах, но любые аннотации, которые я добавляю вручную, будут потеряны, когда генератор парсера снова запустится. Есть ли способ настроить Eclipse для подавления предупреждений для определенного файла или каталога?
Как подавить Java-предупреждения для определенных каталогов или файлов, таких как сгенерированный код
Ответ 1
Начиная с версии 3.8 M6, Eclipse (а именно: JDT) имеет встроенные функции для этого. Он настраивается через путь сборки проекта: Свойства проектa > Путь сборки Java > Компилятоp > Источник
Объявлено здесь: Eclipse 3.8 и 4.2 M6 - новое и заслуживающее внимания, называемое выборочно игнорировать ошибки/предупреждения из исходных папок. Это также, где снимок экрана. Это новая функция, разработанная ранее связанным Ошибка 220928.
Ответ 2
Для этого есть билет, Ошибка 220928, который с тех пор был завершен для Eclipse 3.8. Подробнее см. .
Если вы застряли с Eclipse 3.7 или ниже: пользователь "Marc", комментируя этот билет, создал (или, по крайней мере, ссылки) плагин под названием "warningcleaner" в комментарий 35. Я использую это с большим успехом, ожидая, когда эта функция будет интегрирована в Eclipse.
Это действительно довольно просто:
- Установить плагин.
- Щелкните правой кнопкой мыши проект и выберите "Добавить/удалить сгенерированный код".
- Откройте настройки проекта (щелкните правой кнопкой мыши и выберите "свойства" ).
- Откройте вкладку "Предупреждающий очиститель".
- Выберите исходные папки, из которых вы хотите игнорировать предупреждения.
Ответ 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 или раньше, это может быть полезно. Проверьте этот сайт для деталей установки.