Я использую генератор парсера, который создает несколько уродливый код. В результате мой проект Eclipse содержит несколько десятков предупреждений, исходящих из сгенерированных исходных файлов. Я знаю, что могу использовать аннотацию @SuppressWarning
для подавления особых предупреждений в определенных элементах, но любые аннотации, которые я добавляю вручную, будут потеряны, когда генератор парсера снова запустится. Есть ли способ настроить Eclipse для подавления предупреждений для определенного файла или каталога?Как подавить Java-предупреждения для определенных каталогов или файлов, таких как сгенерированный код
ответ
Я думаю, что лучшее, что вы можете сделать, это включить специальные настройки проекта для отображения предупреждений.
Window -> Preferences -> Java -> Compiler -> Ошибки/предупреждения
На верхней части формы ссылка для настройки конкретных параметров проекта.
Я не думаю, что Eclipse по своей сути обеспечивает способ сделать это на уровне каталогов (но я не уверен).
Вы могли бы сгенерировать файлы в отдельный проект Java и управлять предупреждениями для этого конкретного проекта.
Как правило, я предпочитаю размещать автоматически созданный код в отдельном проекте.
Вы можете подавлять предупреждения только на уровне проекта. Однако вы можете настроить вкладку проблем, чтобы подавлять предупреждения из файлов или пакетов. Перейдите в меню «Конфигурация содержимого» и работайте с областью «On working set:».
Меню Configure Contents не имеет для меня никакого смысла. –
Вы не можете найти его или вы не можете определить, куда его перемещать? Я использую Eclipse 3.4.1 (я думаю, что установка Ganymede с добавлением PyDev). Он расположен в верхнем правом углу вкладки «Проблемы», когда вы нажимаете на значок маленькой стрелки, чтобы вывести меню для этой вкладки. – Greg
Я могу найти его. Я не понимаю, что изменит настройки в этом диалоге. –
Я делаю это с несколькими ANTLR-грамматиками, которые генерируют парсер Java, используя Ant. Скрипт сборки Ant добавляет @SuppressWarnings("all")
в один файл Java и @Override
к нескольким методам в другом. Я могу посмотреть, как это делается в точности, если вам интересно.
Интересная идея. Разве @SuppressWarnings не должен появляться перед объявлением класса (т. Е. Это не так просто, как вставить его в первую строку файла)? –
Его нужно разместить там, но это выполнимо. Мне нужно было глубоко погрузиться в документацию муравьев, чтобы найти правильную функцию, но у меня нет большого опыта работы с Ant. – Jorn
См. Http://www.antlr.org/wiki/pages/viewpage.action?pageId=1865, который описывает, как изменить шаблон ANTLR Java codegen. Однако неясно, как это сделать при использовании плагина ANTLR для Eclipse. Я думаю, что один из них остается взломать банку с плагином или использовать один из других обходных решений, перечисленных выше. – djb
В случае ANTLR 2 можно подавить предупреждения в сгенерированном коде appenidng @SuppressWarnings
перед объявлением класса в файле грамматики, например.
{@SuppressWarnings("all")} class MyBaseParser extends Parser;
Я решил эту проблему с помощью Maven регулярного выражения замены плагина - это не устраняют причину, но лечит боль:
<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
Поскольку Maven не упоминался, это не обязательно отвечает на вопрос. Но он отлично работает в моем случае, поскольку я использую Maven ;-) – Kutzi
То же самое можно сделать, если вы используете Ant вместо Maven, см. Мой ответ. – Jorn
кажется, что ANTLR 3.4 добавляет аннотацию самостоятельно, но мне нравится общность решения (не только ANTLR генерирует код). Чтобы по-прежнему применять его ко всем сгенерированным источникам, я использую этот шаблон: '^ (@ SuppressWarnings \ (. *? \) \ S +)? Public class'. Включая аннотацию в шаблоне, она не дублируется, если она уже существует. –
Существует билет на это, Bug 220928, что с тех пор было завершено Затмения 3.8. Пожалуйста, см. this answer.
Если вы застряли с Eclipse 3.7 или ниже: пользователь «Marc», комментируя этот билет, создал (или, по крайней мере, ссылки) плагин под названием «warningcleaner» в comment 35. Я использую это с большим успехом, ожидая, когда эта функция будет интегрирована в Eclipse.
Это действительно очень просто:
- Установить плагин.
- Щелкните правой кнопкой мыши проект и выберите «Добавить/удалить сгенерированный код».
- Откройте настройки проекта (щелкните правой кнопкой мыши и выберите «свойства»).
- Откройте вкладку «Предупреждающий очиститель».
- Выберите исходные папки, на которые вы хотите игнорировать предупреждения.
К сожалению, ссылка на плагин дает 403 сейчас – Kutzi
Черт, это отстой. У меня все еще есть это, но я бы предпочел не загружать его без явного разрешения автора, в частности, поскольку он не указывает никакой лицензии вообще. Можете ли вы попытаться отследить оригинального автора и попросить его перезагрузить его, пожалуйста? Например, вы можете опубликовать сообщение об ошибке, он по-прежнему указан как CC. –
Похоже, что прогресс по-прежнему делается (чтение комментариев об ошибке) к основной реализации. Обязательно обновите вопрос/ответ, чтобы использовать определенные номера версий, если эта функция реализована. В противном случае будущие пользователи Eclipse могут быть смущены. –
Пользователь @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' />
Обратите внимание, что Муравьев < замены> делает замену текста, а не регулярная замена выражений, поэтому он может не использовать^мета-символ в маркере, чтобы соответствовать начало строки, как Maven регулярное выражение замены плагина делает.
Я делаю это в то же время, когда я запускаю Antlr из maven-antrun-plugin в моем maven pom, потому что плагин ANTLR maven не очень хорошо работает с плагином Cobertura maven.
(Я понимаю, что это не ответ на оригинальный вопрос, но я не могу форматировать Ant код в комментарии/ответ на другой ответ, только в ответ)
Это может быть сделано за счет исключения некоторых каталоги из пути сборки (в следующем примере задается с помощью Eclipse 3.5)
[1] Поднимают Java Build Path
- Кликните на projectin Package Explorer
- Щелкните правой кнопкой мыши, свойства
- Выберите Java Build Path
[2] Добавить каталоги исключить
- Вкладка Источник должен содержать подробную информацию о исходных папок проекта
- Раскройте папку источника и найдите свойство «Исключено:»
- Выберите «Исключено:» и нажмите «Редактировать»
- Добавить папки в шаблоны исключения с помощью объявления d/Добавить несколько опций
- Нажмите «Готово», затем «ОК» для восстановления Eclipse.
Начиная с версии 3.8 M6, Eclipse (если быть точным: JDT) имеет встроенные функции для этого. Он настраивается через путь сборки проекта, в: Свойства проекта> Java Build Path> Compiler> Источник
Объявлено здесь: Eclipse 3.8 and 4.2 M6 - New and Noteworthy, называется Выборочно игнорировать ошибки/предупреждения от исходных папок. Это также, где снимок экрана. Это новая функция, разработанная на ранее связанном Bug 220928.
Я не мог найти, как переключить «Нет» -> «Да» ... это кнопка «Переключить» (и не редактировать или что-то еще) ;-) – Betlista
@Betlista: просто дважды щелкните по ней. Или нажмите кнопку «Переключить» справа. – altumano
@hheimbuerger: это решение работает только для исходных папок. Но что, если у меня просто есть папка в проекте, содержащая некорректные XML-файлы? Мне очень неприятно видеть предупреждения о них :( – altumano
Этот небольшой скрипт 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.')
Это было некоторое время, так как я выпустил предупреждение Чистильщик плагин, и теперь, когда я использую Eclipse, 3.8, у меня нет необходимости в ней больше. Однако для тех, кому еще нужен этот плагин, я выпустил его на github с сайтом обновлений на bintray. Если вы все еще используете Eclipse 3.7 или раньше, это может быть полезно. Проверьте данные this site.
Связано с http://stackoverflow.com/questions/230199/filtering-warnings-in-eclipse-by-filename – Gray