web-dev-qa-db-fra.com

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

J'utilise un générateur d'analyseur qui crée du code quelque peu moche. Par conséquent, mon projet Eclipse comporte plusieurs dizaines d'avertissements émanant de fichiers source générés. Je sais que je peux utiliser le @SuppressWarning annotation 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?

109
Chris Conway

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

enter image description here

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 lien précédent Bogue 220928 .

89
Henrik Heimbuerger

Il existe un ticket pour cela, Bogue 220928 , qui a depuis été terminé pour Eclipse 3.8. Veuillez voir cette réponse pour plus de détails.

Si vous êtes coincé avec Eclipse 3.7 ou une version antérieure: L'utilisateur "Marc" commentant ce ticket a créé (ou au moins un lien vers) un plugin appelé "warningcleaner" dans 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 (faites un clic droit et sélectionnez "propriétés").
  4. Ouvrez l'onglet "Warning Cleaner".
  5. Sélectionnez les dossiers source dont vous souhaitez ignorer les avertissements.

Warning Cleaner screenshot

20
Henrik Heimbuerger

J'ai résolu cela en utilisant le plugin de remplacement maven regexp - 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 exactement le chemin.

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

17
Knubo

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.

7
jjnguy

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> de Ant fait le remplacement de texte, pas le remplacement d'expressions régulières, donc il ne peut pas utiliser le méta-caractère ^ dans le jeton pour faire correspondre le début de la ligne comme le fait le plugin de remplacement maven regexp.

Je fais cela en même temps que j'exécute Antlr à partir du plug-in maven-antrun dans mon pom Maven, car le plug-in ANTLR maven ne fonctionnait pas bien avec le plug-in 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)

4
djb

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

Vous pouvez faire en sorte que les fichiers générés soient placés dans un projet Java 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 distinct de toute façon.

1
Uri

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 utilisez la portée "Sur le jeu de travail:".

1
Greg

Ce petit script python "patche" les fichiers générés par M2E .classpath Et ajoute la balise XML requise à tous les dossiers source commençant par target/generated-sources. Vous pouvez simplement exécuter à partir du dossier racine de votre projet. Évidemment, vous devez le relancer lorsque les informations du projet Eclipse sont régénérées à partir de M2E. Et à 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.')
1
opajonk

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

1
Jorn

Cela peut être fait en excluant certains répertoires du chemin de génération (l'exemple suivant est donné à l'aide d'Eclipse 3.5)

[1] Affichez le Java Chemin de génération

  • Cliquez sur le projet dans l'explorateur de packages
  • Clic droit, propriétés
  • Sélectionnez Java Build Path

[2] Ajouter des répertoires à exclure

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

Cela fait un moment que je n'ai pas sorti le plugin de nettoyage d'avertissement, 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. Vérifiez ce site pour les détails d'installation.

0
Marc

Dans le cas d'ANTLR 2, il est possible de supprimer les avertissements dans le code généré par appenidng @SuppressWarnings avant la déclaration de classe dans le fichier de grammaire, par exemple.

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