2009-07-14 1 views
101

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

+0

Связано с http://stackoverflow.com/questions/230199/filtering-warnings-in-eclipse-by-filename – Gray

ответ

7

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

Window -> Preferences -> Java -> Compiler -> Ошибки/предупреждения

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

1

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

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

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

1

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

+0

Меню Configure Contents не имеет для меня никакого смысла. –

+0

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

+0

Я могу найти его. Я не понимаю, что изменит настройки в этом диалоге. –

1

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

+0

Интересная идея. Разве @SuppressWarnings не должен появляться перед объявлением класса (т. Е. Это не так просто, как вставить его в первую строку файла)? –

+0

Его нужно разместить там, но это выполнимо. Мне нужно было глубоко погрузиться в документацию муравьев, чтобы найти правильную функцию, но у меня нет большого опыта работы с Ant. – Jorn

+0

См. Http://www.antlr.org/wiki/pages/viewpage.action?pageId=1865, который описывает, как изменить шаблон ANTLR Java codegen. Однако неясно, как это сделать при использовании плагина ANTLR для Eclipse. Я думаю, что один из них остается взломать банку с плагином или использовать один из других обходных решений, перечисленных выше. – djb

0

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

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

Я решил эту проблему с помощью 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

+0

Поскольку Maven не упоминался, это не обязательно отвечает на вопрос. Но он отлично работает в моем случае, поскольку я использую Maven ;-) – Kutzi

+0

То же самое можно сделать, если вы используете Ant вместо Maven, см. Мой ответ. – Jorn

+1

кажется, что ANTLR 3.4 добавляет аннотацию самостоятельно, но мне нравится общность решения (не только ANTLR генерирует код). Чтобы по-прежнему применять его ко всем сгенерированным источникам, я использую этот шаблон: '^ (@ SuppressWarnings \ (. *? \) \ S +)? Public class'. Включая аннотацию в шаблоне, она не дублируется, если она уже существует. –

20

Существует билет на это, Bug 220928, что с тех пор было завершено Затмения 3.8. Пожалуйста, см. this answer.

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

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

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

Warning Cleaner screenshot

+0

К сожалению, ссылка на плагин дает 403 сейчас – Kutzi

+0

Черт, это отстой. У меня все еще есть это, но я бы предпочел не загружать его без явного разрешения автора, в частности, поскольку он не указывает никакой лицензии вообще. Можете ли вы попытаться отследить оригинального автора и попросить его перезагрузить его, пожалуйста? Например, вы можете опубликовать сообщение об ошибке, он по-прежнему указан как CC. –

+1

Похоже, что прогресс по-прежнему делается (чтение комментариев об ошибке) к основной реализации. Обязательно обновите вопрос/ответ, чтобы использовать определенные номера версий, если эта функция реализована. В противном случае будущие пользователи Eclipse могут быть смущены. –

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' /> 

Обратите внимание, что Муравьев < замены> делает замену текста, а не регулярная замена выражений, поэтому он может не использовать^мета-символ в маркере, чтобы соответствовать начало строки, как Maven регулярное выражение замены плагина делает.

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

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

0

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

[1] Поднимают Java Build Path

  • Кликните на projectin Package Explorer
  • Щелкните правой кнопкой мыши, свойства
  • Выберите Java Build Path

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

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

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

enter image description here

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

+2

Я не мог найти, как переключить «Нет» -> «Да» ... это кнопка «Переключить» (и не редактировать или что-то еще) ;-) – Betlista

+0

@Betlista: просто дважды щелкните по ней. Или нажмите кнопку «Переключить» справа. – altumano

+1

@hheimbuerger: это решение работает только для исходных папок. Но что, если у меня просто есть папка в проекте, содержащая некорректные XML-файлы? Мне очень неприятно видеть предупреждения о них :( – altumano

0

Этот небольшой скрипт 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

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