2012-10-10 55 views
7

Por mi vida, estoy tratando de conseguir FindBugs (2.0.1) para que se ejecute como parte de mi compilación Ant de línea de comandos. He descargado el archivo JAR FindBugs y extrajeron a /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1:FindBugs se niega a encontrar bcel jar en classpath

enter image description here

Como se puede ver en la pantalla, bajo /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib hay un JAR llamado bcel-1.0.jar, y si lo abres, puedes ver que he profundizado en una clase llamada org.apache.bcel.classfile.ClassFormatException . Sostenga ese pensamiento.

Copié /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib/findbugs-ant.jar en $ {env.ANT_HOME}/lib para que sea accesible a la versión de Ant que se ejecuta desde la línea de comandos (en lugar de la instancia Ant que viene incorporada en Eclipse).

Mi estructura de directorios del proyecto es el siguiente:

/home/myuser/sandbox/workbench/eclipse/workspace/myapp/ 
    src/ 
     main/ 
      java/ 
     test/ 
      java/ 
    build/ 
     build.xml 
     build.properties 
    gen/ 
     bin/ 
      main/ --> where all main Java class files compiled to 
      test/ --> where all test Java class files compiled to 
     audits/ 
      qual/ 
     staging/ 

Dentro build.xml:

<project name="myapp-build" basedir=".." default="package" 
    xmlns:fb="antlib:edu.umd.cs.findbugs"> 

    <path id="findbugs.source.path"> 
     <fileset dir="src/main/java"> 
      <include name="**.*java"/> 
     </fileset> 
     <fileset dir="src/main/test"> 
      <include name="**.*java"/> 
     </fileset> 
    </path> 

    <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" 
     uri="antlib:edu.umd.cs.findbugs"/> 

    <!-- Other Ant target omitted for brevity. --> 

    <target name="run-findbugs"> 
     <!-- Create a temp JAR that FindBugs can use for analysis. --> 
     <property name="fb.tmp.jar" value="gen/staging/${ant.project.name}-findbugs-temp.jar"/> 
     <echo message="Creating ${fb.tmp.jar} for FindBugs."/> 
     <jar destfile="gen/staging/${ant.project.name}-findbugs-temp.jar"> 
      <fileset dir="gen/bin/main" includes="**/*.class"/> 
      <fileset dir="gen/bin/test" includes="**/*.class"/> 
     </jar> 

     <echo message="Conducting code quality tests with FindBugs."/> 
     <fb:findbugs home="/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1" 
      output="html" outputFile="gen/audits/qual/findbugs.html" stylesheet="fancy-hist.xsl" failOnError="true"> 
      <sourcePath refid="findbugs.source.path"/> 
      <class location="${fb.tmp.jar}"/> 
     </fb:findbugs> 
    </target> 

    <target name="echoMsg" depends="run-findbugs"> 
     <echo message="The build is still alive!!!"/> 
    </target> 
</project> 

Pero cuando corro ant -buildfile build.xml echoMsg desde la línea de comandos, me sale un error en FindBugs:

run-findbugs: 
    [echo] Creating gen/staging/myapp-build-findbugs-temp.jar for FindBugs. 
    [jar] Building jar: /home/myuser/sandbox/workbench/eclipse/workspace/myapp/gen/staging/myapp-build-findbugs-temp.jar 
    [echo] Conducting code quality tests with FindBugs. 
[fb:findbugs] Executing findbugs from ant task 
[fb:findbugs] Running FindBugs... 
[fb:findbugs] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException 
[fb:findbugs] Caused by: java.lang.ClassNotFoundException: org.apache.bcel.classfile.ClassFormatException 
[fb:findbugs] at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
[fb:findbugs] at java.security.AccessController.doPrivileged(Native Method) 
[fb:findbugs] at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
[fb:findbugs] at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
[fb:findbugs] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
[fb:findbugs] at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
[fb:findbugs] Could not find the main class: edu.umd.cs.findbugs.FindBugs2. Program will exit. 
[fb:findbugs] Java Result: 1 
[fb:findbugs] Output saved to gen/audits/qual/findbugs.html 

echoMsg: 
    [echo] The build is still alive!!! 

Esto es lo que me tiene sorprendido:

  • Incluso con failOnError="true", FindBugs no es detener la generación aún cuando esta excepción en tiempo de ejecución se encuentra
  • La última pieza de la producción "Output saved to gen/audits/qual/findbugs.html" es una mentira! No hay nada en gen/audits/qual!
  • El bcel-1.0.jar está absolutamente debajo de los FindBugs en casa, al igual que cualquier otro JAR en el directorio lib /.

Atención:: la findbugs-ant.jar es, sin duda copian en ANT_HOME/lib; de lo contrario, obtendría una compilación fallada quejándose de que no podía encontrar las tareas Ant. Como un control de cordura, seguí adelante y lo hice (borré el findbugs-ant.jar de ANT_HOME/lib y obtuve una compilación fallada). Esta construcción no falla (¡tiene éxito!). Simplemente no ejecuta findbugs.

¿Alguien puede detectar lo que está pasando aquí? ¡Gracias por adelantado!

+1

Ver http://stackoverflow.com/questions/12744819/findbugs-issue-with-ant/ –

Respuesta

0

Lo curioso porque yo estoy usando la misma versión de Findbugs y el archivo JAR es nombrado bcel.jar no bcel-1.0.jar. También estoy ejecutando Findbugs desde un script Ant. Por loco que pueda parecer, intente descargar los Findbugs una vez más, descomprímalo en el lugar de su actual y ejecute el script una vez más.

1

Supongo que realmente tiene BCEL en el classpath dos veces. Y el archivo se carga desde el contenedor fuera de la biblioteca FindBugs. Luego, cuando FindBugs intenta cargar el jar, encuentra el BCEL en la biblioteca FindBugs y no puede cargarlo, porque ya está cargado.

La solución sería encontrar dónde más BCEL existe en el classpath y eliminarlo.

+0

Eso es una gran sugerencia @Zagrev (1) Voy a Pruébalo en unos minutos aquí. Solo por curiosidad, ¿qué te hizo sospechar que este era el caso? Solo pregunto porque no lo hubiera pensado en 1.000 años, ¡y tiene sentido! (Definitivamente he agregado este JAR en otro lugar recientemente ...) – IAmYourFaja

+0

horrible, horrible experiencia :) – Zagrev

+0

Bueno, tomó un tiempo, pero revisé cada archivo JAR en 'ANT_HOME/lib' y en mi página de FindBugs directorio, y ese 'bcel-1.0.jar' es el * solo * JAR que contiene esa clase. ¿Alguna otra idea? ¡Gracias de nuevo! – IAmYourFaja

1

Puede que tenga que definir un AuxClasspath para incluir el classpath que su tarea <javac> utilizó al compilar sus archivos de clase.

No mostrar cómo se llevó a cabo la compilación, así que estoy asumiendo que su creado una referencia compile.classapath ruta de clases:

<javac destdir="gen/bin/main" 
    srcdir="src/main/java" 
    classpathref="compile.classpath"/> 

<fb:findbugs home="/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1" 
    output="html" outputFile="gen/audits/qual/findbugs.html" stylesheet="fancy-hist.xsl" failOnError="true"> 
    <auxClasspath refid="compile.classpath"/> 
    <sourcePath refid="findbugs.source.path"/> 
    <class location="${fb.tmp.jar}"/> 
</fb:findbugs> 
+0

Gracias @David W. (+1) - agregó el 'auxClasspath' y todavía el mismo error. Realmente siento que Zagrev podría haber estado en algo con la idea duplicada de JAR, pero parece que no puedo encontrarlo. Me pregunto, ¿hay alguna herramienta por la que pueda apuntar mi directorio ANT_HOME/lib, y que imprima una lista de cada clase Java dentro de cada JAR en ese directorio? De esa manera podría escanear la salida para las clases duplicadas de BCEL. – IAmYourFaja

+0

@pnongrata _¿Hay alguna herramienta por la que pueda apuntar mi directorio ANT_HOME/lib, y hacer que imprima una lista de cada clase Java dentro de cada JAR en ese directorio? "_ Eche un vistazo a [Tattle Tale de JBoss] (http://www.jboss.org/tattletale). –

3

Puede depurar donde BCEL se carga desde el uso de la opción -verbose: argumento de clase para el jvm.

para pasar este argumento a la JVM findbugs correr, usar la bandera jvmargs en los encontrar errores plugin de

jvmargs

atributo opcional. Especifica los argumentos que deberían ser pasados ​​a la máquina virtual Java utilizada para ejecutar FindBugs. Puede necesitar para usar este atributo para especificar indicadores para aumentar la cantidad de memoria que la JVM puede usar si está analizando un programa muy grande.

¿Cómo llegaste a find bugs lib jar? Cuando descargo findbugs.zip, obtengo un directorio lib que se ve muy diferente de lo que muestra. En particular, el mío contiene un bcel con una versión de 5.3, no 1.0 como se muestra.

+0

Gracias @sbridges Lo comprobaré, y estoy usando Ant 1.8.4 – IAmYourFaja

+2

Creo que tiene la versión de bcel equivocada. Si descargo findbugs 2.0.1.zip, el paquete que incluye es 5.0.3 – sbridges

1

No veo en su script Ant que el bcel esté aterrizando en cualquier vía de acceso de clases desde la que la tarea findbugs pueda cargarlo. Es posible que desee intentar hacer que su tarea incluya explícitamente todo lo que findbugs necesita.

<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" 
    uri="antlib:edu.umd.cs.findbugs"> 
    <classpath> 
    <fileset dir="/home/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1"> 
     <include name="*.jar"/> 
    </fileset> 
    </classpath> 
</taskdef> 
Cuestiones relacionadas