Come sopprimere gli avvisi Java per directory o file specifici come il codice generato


110

Sto usando un generatore di parser che crea codice un po 'brutto. Di conseguenza il mio progetto Eclipse ha diverse dozzine di avvisi provenienti dai file sorgente generati. So di poter utilizzare l' @SuppressWarningannotazione per sopprimere particolari avvisi in particolari elementi, ma tutte le annotazioni che aggiungo a mano andranno perse quando il generatore di parser verrà eseguito di nuovo. C'è un modo per configurare Eclipse per sopprimere gli avvisi per un particolare file o directory?


Risposte:


91

A partire dalla versione 3.8 M6, Eclipse (per l'esattezza: il JDT) ha funzionalità integrate per questo. È configurabile tramite il percorso di compilazione di un progetto: Proprietà progetto> Percorso build Java> Compilatore> Sorgente

inserisci qui la descrizione dell'immagine

Annunciato qui: Eclipse 3.8 e 4.2 M6 - Nuovo e degno di nota , chiamato Ignora selettivamente errori / avvisi dalle cartelle di origine . È anche da dove proviene lo screenshot. Questa è la nuova funzionalità sviluppata sul Bug 220928 precedentemente collegato .


2
Non sono riuscito a trovare come cambiare "No" -> "Sì" ... è il pulsante "Toggle" (e non modificare o qualcos'altro) ;-)
Betlista

@Betlista: fai doppio clic su di esso. Oppure fai clic sul pulsante Attiva / disattiva a destra.
altumano

1
@hheimbuerger: questa soluzione funziona solo per le cartelle di origine. Ma cosa succede se ho solo una cartella nel progetto contenente alcuni file XML non validi? Odio vedere avvertimenti su di loro :(
altumano

@altumano La funzione / opzione di cui sopra proviene dal plugin JDT, cioè il supporto Java per Eclipse. (Ricorda che praticamente tutto in Eclipse è un plugin, anche il supporto Java non è integrato.) Quindi dovresti ricontrollare con lo sviluppatore del plugin che usi per eseguire la convalida XML. IIRC, ce ne sono numerosi, quindi dovresti probabilmente aprire una nuova domanda specifica per quella che stai utilizzando.
Henrik Heimbuerger

+1. A proposito, quale sistema operativo hai usato? Il rendering dei caratteri è piuttosto strano.
Nome visualizzato

20

C'è un ticket per questo, Bug 220928 , che da allora è stato completato per Eclipse 3.8. Si prega di consultare questa risposta per i dettagli.

Se sei bloccato con Eclipse 3.7 o inferiore: l'utente "Marc" che commenta quel ticket ha creato (o almeno si collega a) un plugin chiamato 'warningcleaner' nel commento 35 . Lo sto usando con molto successo in attesa che questa funzionalità venga integrata in Eclipse.

È davvero molto semplice:

  1. Installa il plugin.
  2. Fare clic con il pulsante destro del mouse sul progetto e selezionare "Aggiungi / rimuovi natura codice generato".
  3. Aprire le impostazioni del progetto (fare clic con il tasto destro e selezionare "proprietà").
  4. Apri la scheda "Warning Cleaner".
  5. Seleziona le cartelle di origine da cui desideri ignorare gli avvisi.

Screenshot di Warning Cleaner


Sfortunatamente il collegamento al plugin fornisce un 403 ora
Kutzi

1
Sembra che siano ancora in corso progressi (leggendo i commenti sul bug) verso un'implementazione di base. Assicurati di aggiornare la domanda / risposta per utilizzare numeri di versione specifici se la funzione è implementata. In caso contrario, i futuri utenti di Eclipse potrebbero essere confusi.
Chris Browne

1
Non credo che la domanda / risposta possa essere attualmente migliorata, poiché la funzionalità deve ancora esistere, ma se la funzionalità viene mai aggiunta a eclipse, qualcuno dovrebbe modificarla. Non necessariamente io, ma se sono nel posto giusto al momento giusto, ovviamente lo farò.
Chris Browne

5
Qualcuno ha un collegamento corrente a questo plugin? Mi piacerebbe poterlo usare!
Tom Tresansky

1
Attenzione: Eclipse ora ha una soluzione integrata per questo, come puoi vedere nell'altra risposta di hheimbuerger. A proposito, hheimbuerger, dovresti effettuare il refactoring di questa risposta con informazioni aggiornate per renderla "ufficiale".
Roberto

18

Ho risolto questo problema utilizzando il plug-in di sostituzione regexp di Maven: non risolve la causa, ma cura il dolore:

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

Nota che non sono riuscito a far funzionare la notazione **, quindi potresti dover specificare esattamente il percorso.

Vedi il commento sotto per un miglioramento su come non generare @SupressWarnings duplicati


Poiché Maven non è stato menzionato, questo non risponde necessariamente alla domanda. Ma funziona benissimo nel mio caso, dato che uso Maven ;-)
Kutzi

La stessa cosa può essere fatta se stai usando Ant invece di Maven, vedi la mia risposta.
Jorn

1
sembra che ANTLR 3.4 aggiunga l'annotazione da solo, ma mi piace la generalità della soluzione (non solo ANTLR genera codice). Per ancora applicarlo a tutte le fonti generate, io uso questo schema: ^(@SuppressWarnings\(.*?\)\s+)?public class. Includendo l'annotazione nel modello, non viene duplicata se è già presente.
Silly Freak

Questo (più o meno) ha funzionato per me - ho dovuto aggiungere ${basedir}/prima targetnel <include>tag. Sembra un po 'janky, ma poiché funziona solo su file generati, lo prendo!
Rob

7

Penso che il meglio che puoi fare sia abilitare le impostazioni specifiche del progetto per la visualizzazione degli avvisi.

Finestra -> Preferenze -> Java -> Compilatore -> Errori / Avvisi

Nella parte superiore del modulo è presente un collegamento per la configurazione delle impostazioni specifiche del progetto.


4

L'utente @Jorn ha accennato al codice Ant per farlo. Ecco cosa ho

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

Nota che il <replace> di Ant esegue la sostituzione del testo, non la sostituzione delle espressioni regolari, quindi non può utilizzare il meta-carattere ^ nel token per abbinare l'inizio della riga come fa il plug-in di sostituzione regexp maven.

Lo sto facendo nello stesso momento in cui eseguo Antlr da maven-antrun-plugin nel mio Maven pom, perché il plugin ANTLR maven non funzionava bene con il plugin Cobertura maven.

(Mi rendo conto che questa non è una risposta alla domanda originale, ma non posso formattare il codice Ant in un commento / risposta a un'altra risposta, solo in una risposta)


1

Non penso che Eclipse fornisca intrinsecamente un modo per farlo a livello di directory (ma non ne sono sicuro).

È possibile inserire i file generati in un progetto Java separato e controllare gli avvisi per quel progetto specifico.

In genere preferisco comunque inserire il codice generato automaticamente in un progetto separato.


1

È possibile sopprimere gli avvisi solo a livello di progetto. Tuttavia, è possibile configurare la scheda dei problemi per sopprimere gli avvisi da file o pacchetti. Vai nel menu Configura contenuto e lavora con l'ambito "Sul working set:".


Il menu Configura contenuto non ha alcun senso per me.
Chris Conway,

Non riesci a trovarlo o non riesci a capire dove navigare al suo interno? Sto usando Eclipse 3.4.1 (penso che sia un'installazione di Ganimede con PyDev aggiunto). Si trova nell'angolo in alto a destra della scheda Problemi quando fai clic sulla piccola icona della freccia per visualizzare il menu di quella scheda.
Greg

Lo trovo. Non capisco cosa comporterebbe la modifica delle impostazioni in quella finestra di dialogo.
Chris Conway,

Posso vedere come potrebbe funzionare, ma poi dovresti usare i working set, che non è una soluzione generica. Si aggiunge al problema perché ora devi aggiornare il tuo working set per vedere gli avvisi giusti.
Peter Dolberg

1

Questo piccolo script python "corregge" i .classpathfile generati da M2E e aggiunge il tag XML richiesto a tutte le cartelle di origine che iniziano con target/generated-sources. Puoi semplicemente eseguirlo dalla cartella principale del tuo progetto. Ovviamente è necessario rieseguirlo quando le informazioni sul progetto Eclipse vengono rigenerate da M2E. E tutto a tuo rischio, ovviamente ;-)

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

Lo sto facendo per alcune grammatiche ANTLR, che generano un parser Java utilizzando Ant. Lo script di build Ant aggiunge @SuppressWarnings("all")a un file Java e @Overridead alcuni metodi in un altro. Posso controllare come è fatto esattamente, se sei interessato.


Un'idea interessante. Non è necessario che @SuppressWarnings venga subito prima della dichiarazione della classe (cioè, non è così facile come inserirlo nella prima riga del file)?
Chris Conway

Deve essere posizionato lì, ma è fattibile. Avevo bisogno di approfondire la documentazione di Ant per trovare la funzione giusta, ma non ho molta esperienza con Ant.
Jorn

Vedere antlr.org/wiki/pages/viewpage.action?pageId=1865 che descrive come modificare il modello di codegen Java ANTLR. Tuttavia, non è chiaro come farlo funzionare quando si utilizza il plug-in ANTLR per Eclipse. Immagino che uno rimanga con l'hacking del file jar del plugin o utilizzando una delle altre soluzioni alternative elencate sopra.
djb

0

Nel caso di ANTLR 2, è possibile sopprimere gli avvisi nel codice generato appenidng @SuppressWarningsprima della dichiarazione di classe nel file di grammatica, ad es.

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

0

Ciò può essere fatto escludendo alcune directory dal percorso di compilazione (L'esempio seguente viene fornito utilizzando Eclipse 3.5)

[1] Visualizza il percorso di compilazione di Java

  • Fare clic sul progetto in Package Explorer
  • Fare clic con il tasto destro, proprietà
  • Seleziona Java Build Path

[2] Aggiungi directory da escludere

  • La scheda Origine dovrebbe contenere i dettagli delle cartelle di origine del progetto
  • Espandi la cartella di origine e individua la proprietà "Escluso:"
  • Seleziona "Escluso:" e fai clic su Modifica
  • Aggiungi cartelle ai modelli di esclusione utilizzando le opzioni Aggiungi / Aggiungi più
  • Fare clic su Fine, quindi su OK per la ricostruzione di Eclipse.

0

È passato un po 'di tempo da quando ho rilasciato il plug-in di pulizia degli avvisi e ora che sto usando Eclipse 3.8, non ne ho più bisogno. Tuttavia, per chi ha ancora bisogno di questo plugin, l'ho rilasciato su GitHub con il sito di aggiornamento su bintray. Se stai ancora usando Eclipse 3.7 o prima, questo potrebbe essere utile. Controllare questo sito per i dettagli di installazione.


0

Se il progetto eclipse viene generato da gradle utilizzando il eclipse comando del plugin Eclipse, l' Selectively ignore errors/warnings from source foldersopzione può essere impostata aggiungendola al livello superiore del build.gradlefile:

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

Ciò presuppone che le origini generate siano nella build/generated/parsercartella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.