Jak pominąć ostrzeżenia Java dotyczące określonych katalogów lub plików, takich jak wygenerowany kod

110

Używam generatora parsera, który tworzy nieco brzydki kod. W rezultacie mój projekt Eclipse ma kilkadziesiąt ostrzeżeń pochodzących z wygenerowanych plików źródłowych. Wiem, że mogę użyć @SuppressWarningadnotacji, aby pominąć określone ostrzeżenia w określonych elementach, ale wszelkie adnotacje dodane ręcznie zostaną utracone po ponownym uruchomieniu generatora parsera. Czy istnieje sposób skonfigurowania Eclipse do pomijania ostrzeżeń dla określonego pliku lub katalogu?

Chris Conway
źródło

Odpowiedzi:

91

Począwszy od wersji 3.8 M6, Eclipse (dokładnie: JDT) ma wbudowaną funkcjonalność do tego. Można go skonfigurować za pomocą ścieżki budowania projektu : Właściwości projektu> Ścieżka budowania Java> Kompilator> Źródło

wprowadź opis obrazu tutaj

Ogłoszone tutaj: Eclipse 3.8 i 4.2 M6 - New and Noteworthy , o nazwie Selektywnie ignoruj ​​błędy / ostrzeżenia z folderów źródłowych . Stąd też pochodzi zrzut ekranu. Jest to nowa funkcja opracowana w powiązanym wcześniej błędzie 220928 .

Henrik Heimbuerger
źródło
2
Nie mogłem znaleźć sposobu na przełączenie "Nie" -> "Tak" ... to przycisk "Przełącz" (nie edytuj ani czegoś innego) ;-)
Betlista
@Betlista: Kliknij go dwukrotnie. Lub kliknij przycisk Przełącz po prawej stronie.
altumano
1
@hheimbuerger: to rozwiązanie działa tylko w przypadku folderów źródłowych. Ale co, jeśli mam tylko folder w projekcie zawierający źle sformułowane pliki XML? Nienawidzę widzieć ostrzeżeń o nich :(
altumano
@altumano Powyższa funkcja / opcja pochodzi z wtyczki JDT, czyli obsługi Javy dla Eclipse. (Pamiętaj, że prawie wszystko w Eclipse jest wtyczką, nawet obsługa Javy nie jest zapieczętowana.) Więc musiałbyś skontaktować się z twórcą wtyczki, której używasz do weryfikacji XML. IIRC, jest ich wiele, więc prawdopodobnie powinieneś otworzyć nowe pytanie specjalnie dla tego, którego używasz.
Henrik Heimbuerger
+1. Swoją drogą, z jakiego systemu operacyjnego korzystałeś? Renderowanie czcionek jest dość dziwne.
Nazwa wyświetlana
20

Jest na to bilet, Bug 220928 , który od tego czasu został ukończony dla Eclipse 3.8. Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.

Jeśli utkniesz z Eclipse 3.7 lub starszym: Użytkownik „Marc” komentujący ten bilet utworzył (lub przynajmniej linki do) wtyczkę o nazwie „warningcleaner” w komentarzu 35 . Używam tego z dużym powodzeniem, czekając na zintegrowanie tej funkcji z Eclipse.

To naprawdę całkiem proste:

  1. Zainstaluj wtyczkę.
  2. Kliknij projekt prawym przyciskiem myszy i wybierz opcję „Dodaj / usuń rodzaj wygenerowanego kodu”.
  3. Otwórz ustawienia projektu (kliknij prawym przyciskiem myszy i wybierz „Właściwości”).
  4. Otwórz zakładkę „Warning Cleaner”.
  5. Wybierz foldery źródłowe, z których chcesz ignorować ostrzeżenia.

Zrzut ekranu programu Warning Cleaner

Henrik Heimbuerger
źródło
Niestety link do wtyczki podaje teraz 403
Kutzi
1
Wygląda na to, że nadal postępuje (czytając komentarze na temat błędu) w kierunku podstawowej implementacji. Pamiętaj, aby zaktualizować pytanie / odpowiedź, aby używać określonych numerów wersji, jeśli funkcja jest zaimplementowana. W przeciwnym razie przyszli użytkownicy Eclipse mogą być zdezorientowani.
Chris Browne
1
Wydaje mi się, że obecnie nie można poprawić pytania / odpowiedzi, ponieważ funkcja jeszcze nie istniała, ale jeśli funkcja zostanie kiedykolwiek dodana do zaćmienia, ktoś powinien to edytować. Niekoniecznie ja, ale jeśli jestem we właściwym miejscu we właściwym czasie, to oczywiście to zrobię.
Chris Browne
5
Czy ktoś ma aktualny link do tej wtyczki? Bardzo chciałbym móc go używać!
Tom Tresansky
1
Uwaga: Eclipse ma teraz wbudowane rozwiązanie tego problemu, jak widać w innej odpowiedzi od hheimbuerger. Nawiasem mówiąc, hheimbuerger, powinieneś zmienić tę odpowiedź za pomocą zaktualizowanych informacji, aby była `` oficjalna ''.
Roberto
18

Rozwiązałem to za pomocą wtyczki Maven regexp replace - nie rozwiązuje on przyczyny, ale leczy ból:

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

Zwróć uwagę, że nie udało mi się uruchomić notacji **, więc być może będziesz musiał dokładnie określić ścieżkę.

Zobacz komentarz poniżej, aby dowiedzieć się, jak nie generować duplikatów @SupressWarnings

Knubo
źródło
Ponieważ nie wspomniano o Mavenie, niekoniecznie odpowiada to na pytanie. Ale w moim przypadku działa świetnie, ponieważ używam Mavena ;-)
Kutzi
To samo można zrobić, jeśli używasz Ant zamiast Mavena, zobacz moją odpowiedź.
Jorn
1
wydaje się, że ANTLR 3.4 sam dodaje adnotację, ale podoba mi się ogólność rozwiązania (nie tylko ANTLR generuje kod). Aby nadal stosować ją do wszystkich generowanych źródeł, używam tego wzoru: ^(@SuppressWarnings\(.*?\)\s+)?public class. Włączając adnotację do wzorca, nie zostanie on zduplikowany, jeśli już tam jest.
Silly Freak
To (bardziej lub mniej) pracował dla mnie - musiałem dodać ${basedir}/wcześniej targetw <include>tagu. To trochę szarpane, ale ponieważ działa tylko na wygenerowanych plikach, wezmę to!
Rob
7

Myślę, że najlepsze, co możesz zrobić, to włączyć ustawienia wyświetlania ostrzeżeń specyficzne dla projektu.

Okno -> Preferencje -> Java -> Kompilator -> Błędy / ostrzeżenia

W górnej części formularza znajduje się łącze do konfigurowania ustawień specyficznych dla projektu.

jjnguy
źródło
4

Użytkownik @Jorn zasugerował kod Ant, aby to zrobić. Oto co mam

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

Zauważ, że <replace> Ant zastępuje tekst, a nie zastępuje wyrażenia regularne, więc nie może użyć meta-znaku ^ w tokenie do dopasowania początku wiersza, tak jak robi to wtyczka maven regexp replace.

Robię to w tym samym czasie, gdy uruchamiam Antlr z wtyczki maven-antrun-plugin w moim pomie Maven, ponieważ wtyczka ANTLR maven nie współpracowała dobrze z wtyczką Cobertura maven.

(Zdaję sobie sprawę, że to nie jest odpowiedź na pierwotne pytanie, ale nie mogę sformatować kodu Ant w komentarzu / odpowiedzi na inną odpowiedź, tylko w odpowiedzi)

djb
źródło
1

Nie sądzę, że Eclipse z natury zapewnia sposób na zrobienie tego na poziomie katalogu (ale nie jestem pewien).

Możesz umieścić wygenerowane pliki w osobnym projekcie Java i kontrolować ostrzeżenia dla tego konkretnego projektu.

Generalnie i tak wolę umieścić wygenerowany automatycznie kod w osobnym projekcie.

Uri
źródło
1

Ostrzeżenia można wyłączyć tylko na poziomie projektu. Możesz jednak skonfigurować kartę problemów, aby pomijać ostrzeżenia z plików lub pakietów. Przejdź do menu Konfiguruj zawartość i pracuj z zakresem „Na zestawie roboczym:”.

Greg
źródło
Menu Konfiguruj zawartość nie ma dla mnie żadnego sensu.
Chris Conway,
Nie możesz go znaleźć lub nie możesz dowiedzieć się, gdzie się w nim poruszać? Używam Eclipse 3.4.1 (myślę, że jest to instalacja Ganymede z dodanym PyDevem). Znajduje się w prawym górnym rogu karty Problemy po kliknięciu małej ikony strzałki, aby rozwinąć menu tej karty.
Greg
Mogę to znaleźć. Nie rozumiem, co przyniosłaby zmiana ustawień w tym oknie dialogowym.
Chris Conway,
Rozumiem, jak to może działać, ale wtedy musiałbyś używać zestawów roboczych, co nie jest rozwiązaniem ogólnym. To zwiększa problem, ponieważ teraz musisz zaktualizować swój zestaw roboczy, aby zobaczyć odpowiednie ostrzeżenia.
Peter Dolberg
1

Ten mały skrypt w języku Python „łata” .classpathpliki wygenerowane przez M2E i dodaje wymagany znacznik XML do wszystkich folderów źródłowych zaczynających się od target/generated-sources. Możesz go po prostu uruchomić z folderu głównego projektu. Oczywiście musisz go ponownie uruchomić, gdy informacje o projekcie Eclipse zostaną ponownie wygenerowane z M2E. A wszystko oczywiście na własne ryzyko ;-)

#!/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.')
opajonk
źródło
0

Robię to z kilkoma gramatykami ANTLR, które generują parser Java przy użyciu Ant. Skrypt budujący Ant dodaje element @SuppressWarnings("all")do jednego pliku Java i @Overridedo kilku metod w innym. Mogę sprawdzić, jak to się robi dokładnie, jeśli jesteś zainteresowany.

Jorn
źródło
Ciekawy pomysł. Czy @SuppressWarnings nie musi występować tuż przed deklaracją klasy (tj. Nie jest to tak łatwe, jak wstawienie go w pierwszym wierszu pliku)?
Chris Conway,
Trzeba go tam umieścić, ale jest to wykonalne. Musiałem zagłębić się w dokumentację mrówek, aby znaleźć odpowiednią funkcję, ale nie mam dużego doświadczenia z Ant.
Jorn,
Zobacz antlr.org/wiki/pages/viewpage.action?pageId=1865, gdzie opisano, jak zmodyfikować szablon ANTLR Java codegen. Jednak nie jest jasne, jak to zrobić, używając wtyczki ANTLR dla Eclipse. Wydaje mi się, że jeden z nich został zhakowaniem słoika wtyczki lub skorzystaniem z jednego z innych obejść wymienionych powyżej.
djb
0

W przypadku ANTLR 2 istnieje możliwość pominięcia ostrzeżeń w generowanym kodzie poprzez dodanie @SuppressWarningsprzed deklaracją klasy w pliku gramatyki np.

{@SuppressWarnings("all")} class MyBaseParser extends Parser;
Manuel Bernhardt
źródło
0

Można to zrobić wykluczając określone katalogi ze ścieżki budowania (poniższy przykład podano przy użyciu Eclipse 3.5)

[1] Wyświetl ścieżkę budowania języka Java

  • Kliknij Project w Eksploratorze pakietów
  • Kliknij prawym przyciskiem myszy, właściwości
  • Wybierz ścieżkę budowania Java

[2] Dodaj katalogi do wykluczenia

  • Zakładka Źródło powinna zawierać szczegółowe informacje o folderach źródłowych projektu
  • Rozwiń folder źródłowy i znajdź właściwość „Wykluczone:”
  • Wybierz „Wykluczone:” i kliknij Edytuj
  • Dodaj foldery do wzorców wykluczeń za pomocą opcji Dodaj / Dodaj wiele
  • Kliknij Zakończ, a następnie OK, aby Eclipse mógł odbudować.
Darren
źródło
0

Minęło trochę czasu, odkąd wypuściłem wtyczkę do czyszczenia ostrzeżeń, a teraz, gdy używam Eclipse 3.8, nie potrzebuję go już. Jednak dla tych, którzy nadal potrzebują tej wtyczki, opublikowałem ją na github z witryną aktualizacyjną na bintray. Jeśli nadal używasz Eclipse 3.7 lub starszego, może to być przydatne. Sprawdź tę witrynę, aby uzyskać szczegółowe informacje na temat instalacji.

Marc
źródło
0

Jeśli projekt eclipse jest generowany z gradle przy użyciu polecenia wtyczki Eclipse, opcję można ustawić, dodając to na najwyższym poziomie pliku: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
            }
        }
    }
}

Zakłada się, że wygenerowane źródła znajdują się w build/generated/parserfolderze.

Roman Konoval
źródło