Comment supprimer les avertissements Java pour des répertoires ou des fichiers spécifiques tels que le code généré


110

J'utilise un générateur d'analyseur qui crée du code quelque peu laid. En conséquence, mon projet Eclipse a plusieurs dizaines d'avertissements émanant des fichiers source générés. Je sais que je peux utiliser l' @SuppressWarningannotation pour supprimer des avertissements particuliers dans des éléments particuliers, mais toutes les annotations que j'ajoute à la main seront perdues lorsque le générateur d'analyseur s'exécutera à nouveau. Existe-t-il un moyen de configurer Eclipse pour supprimer les avertissements pour un fichier ou un répertoire particulier?


Réponses:


91

À partir de la version 3.8 M6, Eclipse (pour être exact: le JDT) a des fonctionnalités intégrées pour cela. Il est configurable via le chemin de construction d'un projet: Propriétés du projet> Chemin de construction Java> Compilateur> Source

entrez la description de l'image ici

Annoncé ici: Eclipse 3.8 et 4.2 M6 - Nouveau et remarquable , appelé Ignorer sélectivement les erreurs / avertissements des dossiers source . C'est aussi de là que vient la capture d'écran. Il s'agit de la nouvelle fonctionnalité développée sur le bogue 220928 précédemment lié .


2
Je n'ai pas pu trouver comment changer "Non" -> "Oui" ... c'est le bouton "Basculer" (et pas modifier ou autre chose) ;-)
Betlista

@Betlista: Double-cliquez dessus. Ou cliquez sur le bouton Basculer sur la droite.
altumano

1
@hheimbuerger: cette solution fonctionne uniquement pour les dossiers sources. Mais que faire si je n'ai qu'un dossier dans le projet contenant des fichiers XML mal formés? Je déteste voir des avertissements à leur sujet :(
altumano

@altumano La fonctionnalité / option ci-dessus provient du plugin JDT, c'est-à-dire du support Java pour Eclipse. (N'oubliez pas que pratiquement tout dans Eclipse est un plugin, même le support Java n'est pas intégré.) Vous devrez donc vérifier auprès du développeur du plugin que vous utilisez pour faire la validation XML. IIRC, il y en a de nombreux, vous devriez donc probablement ouvrir une nouvelle question spécifiquement pour celle que vous utilisez.
Henrik Heimbuerger

+1. Au fait, quel système d'exploitation avez-vous utilisé? Le rendu des polices est assez étrange.
Afficher le nom

20

Il existe un ticket pour cela, le bogue 220928 , qui a depuis été complété pour Eclipse 3.8. Veuillez consulter cette réponse pour plus de détails.

Si vous êtes bloqué avec Eclipse 3.7 ou version antérieure: L 'utilisateur "Marc" commentant ce ticket a créé (ou au moins un lien vers) un plugin appelé "warningcleaner" dans le commentaire 35 . J'utilise cela avec beaucoup de succès en attendant que cette fonctionnalité soit intégrée dans Eclipse.

C'est vraiment assez simple:

  1. Installer le plugin.
  2. Cliquez avec le bouton droit sur le projet et sélectionnez "Ajouter / supprimer la nature du code généré".
  3. Ouvrez les paramètres du projet (cliquez avec le bouton droit de la souris et sélectionnez «propriétés»).
  4. Ouvrez l'onglet 'Warning Cleaner'.
  5. Sélectionnez les dossiers source dont vous souhaitez ignorer les avertissements.

Capture d'écran d'Avertissement Cleaner


Malheureusement, le lien vers le plugin donne maintenant un 403
Kutzi

1
Il semble que des progrès soient toujours en cours (lecture des commentaires sur le bogue) vers une implémentation principale. Assurez-vous de mettre à jour la question / réponse pour utiliser des numéros de version spécifiques si la fonctionnalité est implémentée. Sinon, les futurs utilisateurs d'Eclipse pourraient être confus.
Chris Browne

1
Je ne pense pas que la question / réponse puisse actuellement être améliorée, car la fonctionnalité n'existe pas encore, mais si la fonctionnalité est jamais ajoutée à eclipse, quelqu'un devrait la modifier. Pas nécessairement moi, mais si je suis au bon endroit au bon moment, bien sûr, je le ferai.
Chris Browne

5
Quelqu'un a-t-il un lien actuel vers ce plugin? J'adorerais pouvoir l'utiliser!
Tom Tresansky

1
Attention: Eclipse a maintenant une solution intégrée pour cela, comme vous pouvez le voir dans l'autre réponse de hheimbuerger. Au fait, hheimbuerger, vous devriez refactoriser cette réponse avec des informations mises à jour pour en faire le «officiel».
Roberto

18

J'ai résolu cela en utilisant le plugin maven regexp replace - il ne résout pas la cause, mais guérit la douleur:

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

Notez que je n'ai pas réussi à faire fonctionner la notation **, vous devrez donc peut-être spécifier le chemin exactement.

Voir le commentaire ci-dessous pour une amélioration sur la façon de ne pas générer de doublon @SupressWarnings


Comme Maven n'a pas été mentionné, cela ne répond pas nécessairement à la question. Mais cela fonctionne très bien dans mon cas, car j'utilise Maven ;-)
Kutzi

La même chose peut être faite si vous utilisez Ant au lieu de Maven, voir ma réponse.
Jorn

1
il semble que ANTLR 3.4 ajoute l'annotation par lui-même, mais j'aime la généralité de la solution (pas seulement ANTLR génère du code). Pour appliquer encore à toutes les sources générées, j'utilise ce modèle: ^(@SuppressWarnings\(.*?\)\s+)?public class. En incluant l'annotation dans le modèle, elle n'est pas dupliquée si elle est déjà là.
Silly Freak

Cela (plus ou moins) a fonctionné pour moi - je devais ajouter ${basedir}/auparavant targetdans la <include>balise. C'est un peu janky, mais comme cela ne fonctionne que sur les fichiers générés, je vais le prendre!
Rob

7

Je pense que le mieux que vous puissiez faire est d'activer les paramètres spécifiques au projet pour afficher les avertissements.

Fenêtre -> Préférences -> Java -> Compilateur -> Erreurs / Avertissements

En haut du formulaire se trouve un lien pour configurer les paramètres spécifiques au projet.


4

L'utilisateur @Jorn a fait allusion au code Ant pour ce faire. Voici ce que j'ai

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

Notez que <replace> d'Ant effectue un remplacement de texte, pas un remplacement d'expression régulière, il ne peut donc pas utiliser le méta-caractère ^ dans le jeton pour correspondre au début de la ligne comme le fait le plugin maven regexp replace.

Je fais cela en même temps que j'exécute Antlr depuis maven-antrun-plugin dans mon Maven pom, car le plugin ANTLR maven ne fonctionnait pas bien avec le plugin Cobertura maven.

(Je me rends compte que ce n'est pas une réponse à la question d'origine, mais je ne peux pas formater le code Ant dans un commentaire / réponse à une autre réponse, uniquement dans une réponse)


1

Je ne pense pas qu'Eclipse fournisse intrinsèquement un moyen de le faire au niveau du répertoire (mais je ne suis pas sûr).

Vous pouvez avoir les fichiers générés dans un projet Java distinct et contrôler les avertissements pour ce projet spécifique.

Je préfère généralement placer le code généré automatiquement dans un projet séparé de toute façon.


1

Vous ne pouvez supprimer les avertissements qu'au niveau du projet. Cependant, vous pouvez configurer votre onglet Problèmes pour supprimer les avertissements des fichiers ou des packages. Allez dans le menu Configurer le contenu et travaillez avec la portée "Sur le jeu de travail:".


Le menu Configurer le contenu n'a aucun sens pour moi.
Chris Conway le

Vous ne pouvez pas le trouver ou vous ne savez pas où naviguer? J'utilise Eclipse 3.4.1 (je pense que c'est une installation de Ganymède avec PyDev ajouté). Il est situé dans le coin supérieur droit de l'onglet Problèmes lorsque vous cliquez sur la petite icône de flèche pour dérouler le menu de cet onglet.
Greg

Je peux le trouver. Je ne comprends pas ce que changerait les paramètres de cette boîte de dialogue.
Chris Conway

Je peux voir comment cela pourrait fonctionner, mais vous devrez alors utiliser des ensembles de travail, ce qui n'est pas une solution générique. Cela ajoute au problème car vous devez maintenant mettre à jour votre ensemble de travail pour voir les bons avertissements.
Peter Dolberg

1

Ce petit script python «corrige» les .classpathfichiers générés par M2E et ajoute la balise XML requise à tous les dossiers source en commençant par target/generated-sources. Vous pouvez simplement l'exécuter à partir du dossier racine de votre projet. De toute évidence, vous devez le réexécuter lorsque les informations du projet Eclipse sont régénérées à partir de M2E. Et le tout à vos risques et périls, évidemment ;-)

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

Je fais cela à quelques grammaires ANTLR, qui génèrent un analyseur Java en utilisant Ant. Le script de construction Ant ajoute le @SuppressWarnings("all")à un fichier Java et @Overrideà quelques méthodes dans un autre. Je peux voir comment cela se fait exactement, si cela vous intéresse.


Une idée intéressante. Le @SuppressWarnings n'a-t-il pas besoin de venir juste avant la déclaration de classe (c'est-à-dire que ce n'est pas aussi simple que de l'insérer sur la première ligne du fichier)?
Chris Conway le

Il doit y être placé, mais c'est faisable. J'avais besoin de plonger profondément dans la documentation de fourmi pour trouver la bonne fonction, mais je n'ai pas beaucoup d'expérience avec Ant.
Jorn le

Voir antlr.org/wiki/pages/viewpage.action?pageId=1865 qui décrit comment modifier le modèle de code ANTLR Java. Cependant, il n'est pas clair comment faire fonctionner cela lors de l'utilisation du plugin ANTLR pour Eclipse. Je suppose que l'on se retrouve avec le piratage du fichier du plugin ou l'utilisation de l'une des autres solutions de contournement énumérées ci-dessus.
djb

0

Dans le cas de ANTLR 2, il est possible de supprimer les avertissements dans le code généré en ajoutant @SuppressWarningsavant la déclaration de classe dans le fichier de grammaire, par exemple

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

0

Cela peut être fait en excluant certains répertoires du chemin de construction (l'exemple suivant est donné en utilisant Eclipse 3.5)

[1] Affichez le chemin de construction Java

  • Cliquez sur le projet dans l'Explorateur de packages
  • Clic droit, propriétés
  • Sélectionnez le chemin de construction Java

[2] Ajouter des répertoires à exclure

  • L'onglet Source doit contenir les détails des dossiers source du projet
  • Développez le dossier source et recherchez la propriété "Exclu:"
  • Sélectionnez "Exclus:" et cliquez sur Modifier
  • Ajouter des dossiers dans les modèles d'exclusion à l'aide des options Ajouter / Ajouter plusieurs
  • Cliquez sur Terminer, puis sur OK pour qu'Eclipse se reconstruise.

0

Cela fait un moment que j'ai publié le plugin Warning-Cleaner, et maintenant que j'utilise Eclipse 3.8, je n'en ai plus besoin. Cependant, pour ceux qui ont encore besoin de ce plugin, je l'ai publié sur github avec le site de mise à jour sur bintray. Si vous utilisez toujours Eclipse 3.7 ou une version antérieure, cela peut être utile. Consultez ce site pour les détails d'installation.


0

Si le projet eclipse est généré à partir de gradle à l'aide de la eclipse commande du plugin Eclipse, l' Selectively ignore errors/warnings from source foldersoption peut être définie en ajoutant ceci au niveau supérieur de votre build.gradlefichier:

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

Cela suppose que les sources générées se trouvent dans un build/generated/parserdossier.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.