Cómo suprimir las advertencias de Java para directorios o archivos específicos, como el código generado

110

Estoy usando un generador de analizador que crea un código algo feo. Como resultado, mi proyecto Eclipse tiene varias docenas de advertencias que emanan de archivos fuente generados. Sé que puedo usar la @SuppressWarninganotación para suprimir advertencias particulares en elementos particulares, pero cualquier anotación que agregue a mano se perderá cuando el generador de analizador se ejecute nuevamente. ¿Hay alguna forma de configurar Eclipse para suprimir las advertencias para un archivo o directorio en particular?

Chris Conway
fuente

Respuestas:

91

A partir de la versión 3.8 M6, Eclipse (para ser exactos: el JDT) tiene una funcionalidad incorporada para esto. Se puede configurar a través de la ruta de compilación de un proyecto: Propiedades del proyecto> Ruta de compilación Java> Compilador> Fuente

ingrese la descripción de la imagen aquí

Anunciado aquí: Eclipse 3.8 y 4.2 M6 - Nuevo y notable , llamado Ignorar selectivamente los errores / advertencias de las carpetas de origen . De ahí también es de donde es la captura de pantalla. Esta es la nueva característica desarrollada en el error 220928 previamente vinculado .

Henrik Heimbuerger
fuente
2
No pude encontrar cómo cambiar "No" -> "Sí" ... es el botón "Alternar" (y no editar o algo más) ;-)
Betlista
@Betlista: Simplemente haz doble clic en él. O haga clic en el botón Alternar a la derecha.
altumano
1
@hheimbuerger: esta solución funciona solo para carpetas de origen. Pero, ¿qué pasa si solo tengo una carpeta en el proyecto que contiene algunos archivos XML con formato incorrecto? Odio ver advertencias sobre ellos :(
altumano
@altumano La característica / opción anterior proviene del complemento JDT, es decir, el soporte de Java para Eclipse. (Recuerde que prácticamente todo en Eclipse es un complemento, incluso el soporte de Java no está integrado). Por lo tanto, tendría que volver a consultar con el desarrollador del complemento que utiliza para realizar la validación XML. IIRC, hay numerosos, por lo que probablemente debería abrir una nueva pregunta específicamente para la que está utilizando.
Henrik Heimbuerger
+1. Por cierto, ¿qué sistema operativo usaste? La representación de fuentes es bastante extraña.
Nombre
20

Hay un ticket para esto, Bug 220928 , que desde entonces se ha completado para Eclipse 3.8. Consulte esta respuesta para obtener más detalles.

Si está atascado con Eclipse 3.7 o inferior: El usuario "Marc" que comentó sobre ese ticket creó (o al menos se vincula a) un complemento llamado 'warningcleaner' en el comentario 35 . Lo estoy usando con mucho éxito mientras espero que esta función se integre en Eclipse.

Es realmente bastante simple:

  1. Instalar complemento.
  2. Haga clic con el botón derecho en el proyecto y seleccione "Agregar / quitar la naturaleza del código generado".
  3. Abra la configuración del proyecto (haga clic con el botón derecho y seleccione "propiedades").
  4. Abra la pestaña 'Limpiador de advertencia'.
  5. Seleccione las carpetas de origen de las que desea ignorar las advertencias.

Captura de pantalla de Warning Cleaner

Henrik Heimbuerger
fuente
Desafortunadamente, el enlace al complemento da un 403 ahora
Kutzi
1
Parece que todavía se está progresando (leyendo los comentarios sobre el error) hacia una implementación central. Asegúrese de actualizar la pregunta / respuesta para usar números de versión específicos si la función está implementada. De lo contrario, los futuros usuarios de Eclipse pueden confundirse.
Chris Browne
1
No creo que la pregunta / respuesta pueda mejorarse actualmente, ya que la funcionalidad aún no existe, pero si alguna vez se agrega la funcionalidad a eclipse, alguien debería editar esto. No necesariamente yo, pero si estoy en el lugar correcto en el momento correcto, por supuesto que lo haré.
Chris Browne
5
¿Alguien tiene un enlace actual a este complemento? ¡Me encantaría poder usarlo!
Tom Tresansky
1
Atención: Eclipse ahora tiene una solución incorporada para esto, como puede ver en la otra respuesta de hheimbuerger. Por cierto, hheimbuerger, deberías refactorizar esta respuesta con información actualizada para que sea 'oficial'.
Roberto
18

Resolví esto usando el complemento maven regexp replace; no resuelve la causa, pero cura el dolor:

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

Tenga en cuenta que no logré que la notación ** funcione, por lo que es posible que deba especificar la ruta exactamente.

Consulte el comentario a continuación para ver una mejora sobre cómo no generar @SupressWarnings duplicados

Knubo
fuente
Como no se mencionó a Maven, esto no responde necesariamente a la pregunta. Pero funciona muy bien en mi caso, ya que uso Maven ;-)
Kutzi
Se puede hacer lo mismo si usa Ant en lugar de Maven, vea mi respuesta.
Jorn
1
parece que ANTLR 3.4 agrega la anotación por sí mismo, pero me gusta la generalidad de la solución (no solo ANTLR genera código). Para aún aplicarlo a todas las fuentes generadas, utilizo este patrón: ^(@SuppressWarnings\(.*?\)\s+)?public class. Al incluir la anotación en el patrón, no se duplica si ya está allí.
Silly Freak
Esto (más o menos) funcionó para mí, tuve que agregar ${basedir}/antes targeten la <include>etiqueta. Se siente un poco raro, pero como solo funciona en archivos generados, ¡lo tomaré!
Rob
7

Creo que lo mejor que puede hacer es habilitar la configuración específica del proyecto para mostrar advertencias.

Ventana -> Preferencias -> Java -> Compilador -> Errores / Advertencias

En la parte superior del formulario hay un enlace para configurar los ajustes específicos del proyecto.

jjnguy
fuente
4

El usuario @Jorn insinuó el código Ant para hacer esto. Esto es lo que tengo

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

Tenga en cuenta que <replace> de Ant reemplaza el texto, no la expresión regular, por lo que no puede usar el metacarácter ^ en el token para que coincida con el comienzo de la línea como lo hace el complemento maven regexp replace.

Estoy haciendo esto al mismo tiempo que ejecuto Antlr desde maven-antrun-plugin en mi pom Maven, porque el plugin maven ANTLR no funcionó bien con el plugin Cobertura maven.

(Me doy cuenta de que esta no es una respuesta a la pregunta original, pero no puedo formatear el código Ant en un comentario / respuesta a otra respuesta, solo en una respuesta)

djb
fuente
1

No creo que Eclipse proporcione inherentemente una forma de hacer esto a nivel de directorio (pero no estoy seguro).

Puede hacer que los archivos generados vayan a un proyecto Java separado y controle las advertencias para ese proyecto específico.

En general, prefiero colocar el código generado automáticamente en un proyecto separado de todos modos.

Uri
fuente
1

Solo puede suprimir las advertencias a nivel de proyecto. Sin embargo, puede configurar la pestaña de problemas para suprimir las advertencias de archivos o paquetes. Vaya al menú Configurar contenido y trabaje con el alcance "En conjunto de trabajo:".

Greg
fuente
El menú Configurar contenido no tiene ningún sentido para mí.
Chris Conway
¿No puede encontrarlo o no puede averiguar dónde navegar en él? Estoy usando Eclipse 3.4.1 (creo que es una instalación de Ganymede con PyDev agregado). Se encuentra en la esquina superior derecha de la pestaña Problemas cuando hace clic en el ícono de flecha pequeña para desplegar el menú de esa pestaña.
Greg
Puedo encontrarlo. No entiendo lo que lograría cambiar la configuración en ese cuadro de diálogo.
Chris Conway
Puedo ver cómo podría funcionar esto, pero luego tendrías que usar conjuntos de trabajo, que no es una solución genérica. Se suma al problema porque ahora debe actualizar su conjunto de trabajo para ver las advertencias correctas.
Peter Dolberg
1

Estoy haciendo esto con algunas gramáticas ANTLR, que generan un analizador de Java usando Ant. El script de compilación de Ant agrega el @SuppressWarnings("all")a un archivo Java y @Overridea algunos métodos en otro. Puedo buscar cómo se hace exactamente, si está interesado.

Jorn
fuente
Interesante idea. ¿No es necesario que @SuppressWarnings venga justo antes de la declaración de clase (es decir, no es tan fácil como insertarlo en la primera línea del archivo)?
Chris Conway
Es necesario colocarlo allí, pero es factible. Necesitaba profundizar en la documentación de Ant para encontrar la función correcta, pero no tengo mucha experiencia con Ant.
Jorn
Consulte antlr.org/wiki/pages/viewpage.action?pageId=1865, que describe cómo modificar la plantilla de código genético ANTLR Java. Sin embargo, no está claro cómo hacer que eso funcione cuando se usa el complemento ANTLR para Eclipse. Supongo que a uno le queda piratear el tarro del complemento o usar una de las otras soluciones enumeradas anteriormente.
djb
1

Este pequeño script de Python "parchea" los .classpatharchivos generados por M2E y agrega la etiqueta XML requerida a todas las carpetas de origen que comienzan con target/generated-sources. Puede ejecutarlo desde la carpeta raíz de su proyecto. Obviamente, debe volver a ejecutarlo cuando la información del proyecto Eclipse se vuelva a generar desde M2E. Y todo bajo tu propio riesgo, obviamente ;-)

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

En el caso de ANTLR 2, es posible suprimir las advertencias en el código generado agregando @SuppressWarningsantes de la declaración de clase en el archivo de gramática, por ejemplo

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

Esto se puede hacer excluyendo ciertos directorios de la ruta de compilación (el siguiente ejemplo se da usando Eclipse 3.5)

[1] Abrir la ruta de compilación de Java

  • Haga clic en el proyecto en el Explorador de paquetes
  • Haga clic derecho, propiedades
  • Seleccione la ruta de compilación de Java

[2] Agregar directorios para excluir

  • La pestaña Fuente debe contener detalles de las carpetas fuente del proyecto
  • Expanda la carpeta de origen y busque la propiedad 'Excluido:'
  • Seleccione 'Excluido:' y haga clic en Editar
  • Agregue carpetas a los patrones de exclusión usando las opciones Agregar / Agregar múltiples
  • Haga clic en Finalizar, luego en Aceptar para que Eclipse se reconstruya.
Darren
fuente
0

Ha pasado un tiempo desde que lancé el complemento de limpieza de advertencias, y ahora que estoy usando Eclipse 3.8, ya no lo necesito. Sin embargo, para aquellos que todavía necesitan este complemento, lo he publicado en github con el sitio de actualización en bintray. Si todavía usa Eclipse 3.7 o antes, esto podría ser útil. Consulte este sitio para obtener detalles de instalación.

Bagazo
fuente
0

Si el proyecto eclipse se genera desde gradle usando el eclipse comando del complemento Eclipse, la Selectively ignore errors/warnings from source foldersopción se puede configurar agregando esto en el nivel superior de su build.gradlearchivo:

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

Esto supone que las fuentes generadas están en la build/generated/parsercarpeta.

Roman Konoval
fuente