Як придушити попередження Java для конкретних каталогів або файлів, таких як згенерований код


110

Я використовую генератор парсера, який створює дещо потворний код. Як результат, мій проект Eclipse має кілька десятків попереджень, що виходять із створених вихідних файлів. Я знаю, що я можу використовувати @SuppressWarningанотацію для придушення конкретних попереджень у певних елементах, але будь-які додані мною дані вручну будуть втрачені, коли генератор аналізатора знову запуститься. Чи існує спосіб налаштування Eclipse для придушення попереджень для певного файлу чи каталогу?


Відповіді:


91

Починаючи з версії 3.8 M6, Eclipse (якщо бути точним: JDT) має вбудовану функціональність для цього. Його можна налаштувати за допомогою шляху збирання проекту : Властивості проекту> Шлях збірки Java> Компілятор> Джерело

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

Оголошено тут: Eclipse 3.8 та 4.2 M6 - Нове та заслуговує на увагу , що називається Селективно ігнорувати помилки / попередження з папок джерел . Ось звідки і скріншот. Це нова функція, розроблена на раніше пов'язаному Bug 220928 .


2
Я не міг знайти, як переключити "Ні" -> "Так" ... це кнопка "Переключити" (а не редагувати чи щось інше) ;-)
Betlista

@Betlista: Просто двічі клацніть його. Або натисніть кнопку Переключити праворуч.
altumano

1
@hheimbuerger: це рішення працює лише для вихідних папок. Але що робити, якщо у мене просто є папка в проекті, яка містить деякі неправильно сформовані XML-файли? Я ненавиджу бачити попередження про них :(
altumano

@altumano Вищенаведена функція / опція походить з плагіна JDT, тобто підтримки Java для Eclipse. (Пам'ятайте, що майже все в Eclipse - це плагін, навіть підтримка Java не використовується.) Тож вам доведеться перевірити ще раз розробника плагіна, який ви використовуєте для перевірки XML. IIRC, їх численні, тому ви, ймовірно, повинні відкрити нове питання спеціально для того, яке ви використовуєте.
Генрік Хаймбургер

+1. До речі, яку ОС ви використовували? Відображення шрифту досить дивно.
Відображувати ім'я

20

На це є квиток, Bug 220928 , який з тих пір завершено для Eclipse 3.8. Будь ласка, дивіться цю відповідь для деталей.

Якщо ви застрягли в Eclipse 3.7 або новішої версії: Користувач "Marc", коментуючи цей квиток, створив (або принаймні посилання на) плагін під назвою "попереджувальний пристрій" у коментарі 35 . Я використовую це з великим успіхом, очікуючи інтеграції цієї функції в Eclipse.

Це дуже просто:

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

Скріншот Warning Cleaner


На жаль, посилання на плагін дає 403 зараз
Kutzi

1
Здається, що все ще досягається прогрес (читання коментарів про помилку) у напрямку основної реалізації. Обов’язково оновіть питання / відповідь, щоб використовувати конкретні номери версій, якщо функція реалізована. В іншому випадку майбутні користувачі Eclipse можуть розгубитися.
Кріс Браун

1
Я не вважаю, що питання / відповідь наразі можна покращити, оскільки функціональність ще не існує, але якщо функціонал коли-небудь додається до затемнення, то хтось повинен це редагувати. Не обов'язково я, але якщо я в потрібному місці в потрібний час, то, звичайно, я це зроблю.
Кріс Браун

5
Хтось має поточне посилання на цей плагін? Я б хотів, щоб можна було ним користуватися!
Том Тресанський

1
Увага: Eclipse тепер має вбудоване рішення для цього, як ви бачите в іншій відповіді від Hheimbuerger. До речі, hheimbuerger, вам слід повернути цю відповідь до оновленої інформації, щоб зробити її "офіційною".
Роберто

18

Я вирішив це, використовуючи плагін 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


Оскільки Мавен не згадувався, це не обов'язково відповідає на питання. Але в моєму випадку це чудово підходить, оскільки я використовую Maven ;-)
Kutzi

Те ж саме можна зробити, якщо ви використовуєте Ant замість Maven, дивіться мою відповідь.
Jorn

1
здається, що ANTLR 3.4 додає анотацію сама по собі, але мені подобається загальність рішення (не тільки ANTLR генерує код). Щоб ще застосувати його до всіх згенерованих джерел, я використовую цей шаблон: ^(@SuppressWarnings\(.*?\)\s+)?public class. Якщо включити анотацію до шаблону, він не дублюється, якщо він вже є.
Дурний фрік

Це (більш-менш) працювало для мене - мені довелося додати ${basedir}/раніше targetв <include>тезі. Почувається якимось привабливим, але оскільки він працює лише на створених файлах, я візьму його!
Роб

7

Я думаю, що найкраще, що ви можете зробити, це включити конкретні параметри проекту для відображення попереджень.

Вікно -> Налаштування -> Java -> Компілятор -> Помилки / попередження

У верхній частині форми розміщено посилання для налаштування конкретних параметрів проекту.


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

Зауважте, що Ant's <replace> виконує заміну тексту, а не регулярну заміну виразів, тому він не може використовувати ^ мета-символ у токені, щоб відповідати початку рядка, як це робить плагін Maven regexp substitution.

Я роблю це в той самий час, коли запускаю Antlr з Maven-antrun-плагіна в моєму Maven pom, тому що плагін ANTLR maven не дуже добре поєднується з плагіном Maven Cobertura.

(Я розумію, що це не відповідь на вихідне запитання, але я не можу відформатувати код Ant в коментарі / відповіді на іншу відповідь, лише у відповіді)


1

Я не думаю, що Eclipse по суті надає спосіб зробити це на рівні каталогу (але я не впевнений).

Можливо, згенеровані файли можуть перейти в окремий проект Java та контролювати попередження для цього конкретного проекту.

Я взагалі вважаю за краще розміщувати автоматично створений код в окремому проекті.


1

Ви можете придушити попередження лише на рівні проекту. Однак ви можете налаштувати вкладку "Проблеми", щоб придушити попередження з файлів або пакетів. Перейдіть у меню Налаштувати вміст і працюйте з областю "Про робочий набір:".


Меню Налаштування змісту для мене не має сенсу.
Кріс Конвей

Ви не можете його знайти або не можете зрозуміти, де орієнтуватися в ньому? Я використовую 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. Сценарій збірки мурашок додає @SuppressWarnings("all")файл до одного Java, а @Overrideдо іншого кілька методів. Я можу подивитися, як це робиться, якщо вам це цікаво.


Цікава ідея. Чи не потрібно @SuppressWarnings перед початком оголошення класу (тобто це не так просто, як вставити його в перший рядок файлу)?
Кріс Конвей

Його потрібно розміщувати там, але це можливо. Мені потрібно було зануритися в документацію про мурашки, щоб знайти правильну функцію важко, але я не маю багато досвіду роботи з Ant.
Джорн

Див. Antlr.org/wiki/pages/viewpage.action?pageId=1865, де описано, як змінити шаблон кодена ANTLR Java. Однак незрозуміло, як зробити так, щоб використовувати плагін ANTLR для Eclipse. Я думаю, що один з них може зламати банку плагінів або скористатися одним із інших перелічених вище способів.
djb

0

У випадку з ANTLR 2 можна придушити попередження в згенерованому коді додаванням @SuppressWarningsперед оголошенням класу у граматичному файлі, наприклад

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

0

Це можна зробити, виключивши певні каталоги зі шляху збірки (Наступний приклад наведено за допомогою Eclipse 3.5)

[1] Виведення шляху збірки Java

  • Клацніть на Explorer Explorer Package Explorer
  • Клацніть правою кнопкою миші, властивості
  • Виберіть Java Build Path

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

  • Вкладка "Джерело" повинна містити деталі папок джерела проекту
  • Розгорніть папку-джерело та знайдіть властивість "Виключено:"
  • Виберіть "Виключено:" та натисніть Редагувати
  • Додайте папки до шаблонів виключення за допомогою параметрів Додати / Додати кілька
  • Клацніть Готово, потім добре, щоб Eclipse відновився.

0

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


0

Якщо проект затемнення генерується з gradle за допомогою команди плагіна Eclipse, параметр можна встановити, додавши це на верхньому рівні вашого файлу:eclipseSelectively ignore errors/warnings from source foldersbuild.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папці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.