So unterdrücken Sie Java-Warnungen für bestimmte Verzeichnisse oder Dateien, z. B. generierten Code


110

Ich verwende einen Parser-Generator, der etwas hässlichen Code erstellt. Infolgedessen enthält mein Eclipse-Projekt mehrere Dutzend Warnungen, die von generierten Quelldateien ausgehen. Ich weiß, dass ich die @SuppressWarningAnnotation verwenden kann, um bestimmte Warnungen in bestimmten Elementen zu unterdrücken, aber alle Annotationen, die ich von Hand hinzufüge, gehen verloren, wenn der Parser-Generator erneut ausgeführt wird. Gibt es eine Möglichkeit, Eclipse so zu konfigurieren, dass Warnungen für eine bestimmte Datei oder ein bestimmtes Verzeichnis unterdrückt werden?


Antworten:


91

Ab Version 3.8 M6 verfügt Eclipse (um genau zu sein: das JDT) über integrierte Funktionen. Es kann über den Erstellungspfad eines Projekts konfiguriert werden: Projekteigenschaften> Java -Erstellungspfad > Compiler> Quelle

Geben Sie hier die Bildbeschreibung ein

Hier angekündigt: Eclipse 3.8 und 4.2 M6 - Neu und bemerkenswert , genannt Fehler / Warnungen aus Quellordnern selektiv ignorieren . Dort kommt auch der Screenshot her. Dies ist die neue Funktion, die für den zuvor verknüpften Bug 220928 entwickelt wurde .


2
Ich konnte nicht finden, wie man "Nein" -> "Ja" wechselt ... es ist "Umschalten" (und nicht bearbeiten oder etwas anderes) ;-)
Betlista

@ Betlista: Doppelklicken Sie einfach darauf. Oder klicken Sie rechts auf die Schaltfläche Umschalten.
Altumano

1
@hheimbuerger: Diese Lösung funktioniert nur für Quellordner. Aber was ist, wenn ich nur einen Ordner im Projekt habe, der einige fehlerhafte XML-Dateien enthält? Ich hasse es, Warnungen darüber zu sehen :(
Altumano

@altumano Die obige Funktion / Option stammt aus dem JDT-Plugin, dh der Java-Unterstützung für Eclipse. (Denken Sie daran, dass so ziemlich alles in Eclipse ein Plugin ist, auch die Java-Unterstützung ist nicht integriert.) Sie müssen sich also beim Entwickler des Plugins erkundigen, das Sie für die XML-Validierung verwenden. IIRC gibt es zahlreiche, daher sollten Sie wahrscheinlich eine neue Frage speziell für die von Ihnen verwendete Frage öffnen.
Henrik Heimbuerger

+1. Welches Betriebssystem haben Sie übrigens verwendet? Das Rendern von Schriftarten ist ziemlich seltsam.
Anzeigename

20

Hierfür gibt es ein Ticket, Bug 220928 , das inzwischen für Eclipse 3.8 abgeschlossen wurde. Bitte lesen Sie diese Antwort für Details.

Wenn Sie mit Eclipse 3.7 oder niedriger nicht weiterkommen: Der Benutzer "Marc", der dieses Ticket kommentiert, hat in Kommentar 35 ein Plugin namens "warningcleaner" erstellt (oder zumindest darauf verlinkt) . Ich benutze das mit viel Erfolg, während ich darauf warte, dass diese Funktion in Eclipse integriert wird.

Es ist wirklich ganz einfach:

  1. PIugin installieren.
  2. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie "Generierten Code hinzufügen / entfernen".
  3. Öffnen Sie die Projekteinstellungen (klicken Sie mit der rechten Maustaste und wählen Sie "Eigenschaften").
  4. Öffnen Sie die Registerkarte 'Warning Cleaner'.
  5. Wählen Sie die Quellordner aus, aus denen Sie die Warnungen ignorieren möchten.

Warnung Cleaner Screenshot


Leider gibt der Link zum Plugin jetzt eine 403
Kutzi

1
Es scheint, dass bei einer Kernimplementierung noch Fortschritte erzielt werden (Lesen der Kommentare zum Fehler). Stellen Sie sicher, dass Sie die Frage / Antwort aktualisieren, um bestimmte Versionsnummern zu verwenden, wenn die Funktion implementiert ist. Andernfalls können zukünftige Benutzer von Eclipse verwirrt sein.
Chris Browne

1
Ich bin nicht der Meinung, dass die Frage / Antwort derzeit verbessert werden kann, da die Funktionalität noch nicht vorhanden ist. Wenn die Funktionalität jedoch jemals zu Eclipse hinzugefügt wird, sollte dies jemand bearbeiten. Nicht unbedingt ich, aber wenn ich zur richtigen Zeit am richtigen Ort bin, werde ich das natürlich tun.
Chris Browne

5
Hat jemand einen aktuellen Link zu diesem Plugin? Ich würde es gerne benutzen können!
Tom Tresansky

1
Achtung: Eclipse hat jetzt eine integrierte Lösung dafür, wie Sie in der anderen Antwort von hheimbuerger sehen können. Übrigens, hheimbuerger, sollten Sie diese Antwort mit aktualisierten Informationen überarbeiten, um sie zum "offiziellen" zu machen.
Roberto

18

Ich habe dies mit dem Maven Regexp Replace Plugin gelöst - es löst nicht die Ursache, sondern heilt den Schmerz:

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

Beachten Sie, dass ich es nicht geschafft habe, die ** -Notation zum Laufen zu bringen, sodass Sie möglicherweise den Pfad genau angeben müssen.

Im Kommentar unten finden Sie eine Verbesserung, wie Sie keine doppelten @SupressWarnings generieren können


Da Maven nicht erwähnt wurde, beantwortet dies nicht unbedingt die Frage. Aber es funktioniert großartig in meinem Fall, da ich Maven
benutze ;-)

Das gleiche kann getan werden, wenn Sie Ant anstelle von Maven verwenden, siehe meine Antwort.
Jorn

1
Es scheint, dass ANTLR 3.4 die Annotation selbst hinzufügt, aber ich mag die Allgemeinheit der Lösung (nicht nur ANTLR generiert Code). Um es weiterhin auf alle generierten Quellen anzuwenden, verwende ich dieses Muster : ^(@SuppressWarnings\(.*?\)\s+)?public class. Durch das Einfügen der Anmerkung in das Muster wird sie nicht dupliziert, wenn sie bereits vorhanden ist.
Dumme Freak

Das hat (mehr oder weniger) bei mir funktioniert - ich musste ${basedir}/vorher targetim <include>Tag hinzufügen . Fühlt sich ein bisschen nervös an, aber da es nur bei generierten Dateien funktioniert, nehme ich es!
Rob

7

Ich denke, das Beste, was Sie tun können, ist, projektspezifische Einstellungen für die Anzeige von Warnungen zu aktivieren.

Fenster -> Einstellungen -> Java -> Compiler -> Fehler / Warnungen

Oben im Formular befindet sich ein Link zum Konfigurieren projektspezifischer Einstellungen.


4

Benutzer @Jorn deutete auf Ant-Code, um dies zu tun. Hier ist was ich habe

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

Beachten Sie, dass Ants <replace> die Textersetzung und nicht die Ersetzung regulärer Ausdrücke durchführt. Daher kann das Metazeichen im Token nicht verwendet werden, um mit dem Zeilenanfang übereinzustimmen, wie dies das Maven-Regexp-Ersetzungs-Plugin tut.

Ich mache dies zur gleichen Zeit, in der ich Antlr über das Maven-Antrun-Plugin in meinem Maven-Pom ausführe, da das ANTLR-Maven-Plugin mit dem Cobertura-Maven-Plugin nicht gut funktioniert hat.

(Mir ist klar, dass dies keine Antwort auf die ursprüngliche Frage ist, aber ich kann Ant-Code nicht in einem Kommentar / einer Antwort auf eine andere Antwort formatieren, sondern nur in einer Antwort.)


1

Ich glaube nicht, dass Eclipse von Natur aus eine Möglichkeit bietet, dies auf Verzeichnisebene zu tun (aber ich bin mir nicht sicher).

Sie können die generierten Dateien in ein separates Java-Projekt verschieben und Warnungen für dieses bestimmte Projekt steuern.

Im Allgemeinen ziehe ich es sowieso vor, automatisch generierten Code in einem separaten Projekt zu platzieren.


1

Sie können Warnungen nur auf Projektebene unterdrücken. Sie können die Registerkarte "Probleme" jedoch so konfigurieren, dass Warnungen von Dateien oder Paketen unterdrückt werden. Gehen Sie in das Menü "Inhalt konfigurieren" und arbeiten Sie mit dem Bereich "On Working Set:".


Das Menü Inhalt konfigurieren ergibt für mich keinen Sinn.
Chris Conway

Sie können es nicht finden oder Sie können nicht herausfinden, wo Sie darin navigieren sollen? Ich verwende Eclipse 3.4.1 (ich denke, es ist eine Ganymede-Installation mit PyDev hinzugefügt). Es befindet sich in der oberen rechten Ecke der Registerkarte Probleme, wenn Sie auf das kleine Pfeilsymbol klicken, um das Menü für diese Registerkarte zu öffnen.
Greg

Ich finde es. Ich verstehe nicht, was das Ändern der Einstellungen in diesem Dialog bewirken würde.
Chris Conway

Ich kann sehen, wie das funktionieren könnte, aber dann müssten Sie Arbeitssätze verwenden, was keine generische Lösung ist. Dies trägt zum Problem bei, da Sie jetzt Ihren Arbeitssatz aktualisieren müssen, um die richtigen Warnungen anzuzeigen.
Peter Dolberg

1

Ich mache das mit ein paar ANTLR-Grammatiken, die mit Ant einen Java-Parser generieren. Das Ant-Build-Skript fügt das @SuppressWarnings("all")einer Java-Datei und @Overrideeinigen Methoden in einer anderen hinzu. Ich kann nachschlagen, wie es genau gemacht wird, wenn Sie interessiert sind.


Eine interessante Idee. Müssen die @ SuppressWarnings nicht kurz vor der Klassendeklaration stehen (dh es ist nicht so einfach, sie in die erste Zeile der Datei einzufügen)?
Chris Conway

Es muss dort platziert werden, aber es ist machbar. Ich musste tief in die Ameisendokumentation eintauchen, um die richtige Funktion zu finden, aber ich habe nicht viel Erfahrung mit Ameise.
Jorn

Siehe antlr.org/wiki/pages/viewpage.action?pageId=1865, in dem beschrieben wird, wie die ANTLR-Java-Codegen-Vorlage geändert wird. Es ist jedoch nicht klar, wie dies bei Verwendung des ANTLR-Plugins für Eclipse funktioniert. Ich denke, man muss das Plugin-Glas hacken oder eine der anderen oben aufgeführten Problemumgehungen verwenden.
DJB

1

Dieses kleine Python-Skript "patcht" die von M2E generierten .classpathDateien und fügt allen Quellordnern, beginnend mit, das erforderliche XML-Tag hinzu target/generated-sources. Sie können es einfach aus dem Stammordner Ihres Projekts ausführen. Natürlich müssen Sie es erneut ausführen, wenn die Eclipse-Projektinformationen aus M2E neu generiert werden. Und das alles natürlich auf eigenes Risiko ;-)

#!/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

Im Fall von ANTLR 2 ist es möglich, Warnungen im generierten Code durch Anhängen @SuppressWarningsvor der Klassendeklaration in der Grammatikdatei zu unterdrücken , z

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

0

Dies kann erreicht werden, indem bestimmte Verzeichnisse vom Erstellungspfad ausgeschlossen werden (das folgende Beispiel wird mit Eclipse 3.5 gegeben).

[1] Rufen Sie den Java-Erstellungspfad auf

  • Klicken Sie im Paket-Explorer auf das Projekt
  • Rechtsklick, Eigenschaften
  • Wählen Sie Java Build Path

[2] Fügen Sie Verzeichnisse zum Ausschließen hinzu

  • Die Registerkarte Quelle sollte Details zu den Projektquellordnern enthalten
  • Erweitern Sie den Quellordner und suchen Sie die Eigenschaft 'Ausgeschlossen:'
  • Wählen Sie "Ausgeschlossen:" und klicken Sie auf "Bearbeiten"
  • Fügen Sie Ordner zu den Ausschlussmustern hinzu, indem Sie die Optionen Mehrere hinzufügen / hinzufügen hinzufügen
  • Klicken Sie auf Fertig stellen und dann auf OK, damit Eclipse neu erstellt werden kann.

0

Es ist schon eine Weile her, dass ich das Plugin für Warnreiniger veröffentlicht habe, und jetzt, da ich Eclipse 3.8 verwende, brauche ich es nicht mehr. Für diejenigen, die dieses Plugin noch benötigen, habe ich es auf Github mit der Update-Site auf bintray veröffentlicht. Wenn Sie Eclipse 3.7 oder früher noch verwenden, kann dies hilfreich sein. Überprüfen Sie diese Site auf Installationsdetails.


0

Wenn das Eclipse-Projekt mit dem eclipse Befehl des Eclipse-Plugins aus gradle generiert wird, Selectively ignore errors/warnings from source folderskann die Option festgelegt werden, indem Sie dies auf der obersten Ebene Ihrer build.gradleDatei hinzufügen :

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.each { entry -> 
            if (entry.path.contains('build/generated/parser')) {
                entry.entryAttributes['ignore_optional_problems'] = true
            }
        }
    }
}

Dies setzt voraus, dass sich die generierten Quellen im build/generated/parserOrdner befinden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.