2012-10-10 12 views
7

Per la vita di me, sto cercando di ottenere FindBugs (2.0.1) da eseguire come parte della mia build di form da riga di comando. Ho scaricato il JAR FindBugs ed estratto a /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1:FindBugs rifiuta di trovare il vaso bcel su classpath

enter image description here

Come potete vedere nello screenshot, sotto /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib c'è un JAR chiamato bcel-1.0.jar, e se lo apri, puoi vedere che ho eseguito il drill-down su una classe chiamata org.apache.bcel.classfile.ClassFormatException . Tenere quel pensiero.

Ho quindi copiato /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib/findbugs-ant.jar a $ {env.ANT_HOME}/lib per renderlo accessibile alla versione di Ant che viene eseguita dalla riga di comando (anziché dall'istanza Ant che viene incorporata in Eclipse).

Il mio progetto struttura di directory è la seguente:

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

All'interno 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> 

Ma quando corro ant -buildfile build.xml echoMsg dalla riga di comando, ottengo un errore in 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!!! 

Ecco cosa mi ha fatto stupito:

  • Anche con failOnError="true", FindBugs non è arrestare la build, anche quando si verifica questa eccezione di runtime
  • L'ultimo pezzo di uscita "Output saved to gen/audits/qual/findbugs.html" è una menzogna! C'è nulla in gen/audits/qual!
  • Il bcel-1.0.jar è assolutamente sotto casa FindBugs, proprio come ogni altro JAR nella directory lib /.

Si prega di notare: il findbugs-ant.jar è sicuramente copiato ANT_HOME/lib; altrimenti mi troverei in una build fallita lamentandomi che non riusciva a trovare le attività di Ant. Come controllo di integrità, sono andato avanti e l'ho fatto (ho cancellato lo findbugs-ant.jar da ANT_HOME/lib e ho ottenuto una build fallita). Questa build non fallisce (ci riesce!). Semplicemente non esegue findbugs.

Qualcuno può vedere cosa sta succedendo qui? Grazie in anticipo!

+1

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

risposta

0

cosa divertente perché sto usando la stessa versione del Findbugs e il file jar è chiamato bcel.jar non bcel-1.0.jar. Sto anche eseguendo Findbug da uno script Ant. Per quanto possa sembrare folle, prova ancora una volta a scaricare i Findbugs, disimballali al posto di quello attuale ed esegui nuovamente lo script.

1

La mia ipotesi è che si abbia effettivamente BCEL nel classpath due volte. E il file viene caricato dal jar all'esterno della libreria FindBugs. Quindi, quando FindBugs tenta di caricare il jar, trova BCEL nella libreria TrovaBugs e non riesce a caricarlo perché è già caricato.

La soluzione sarebbe trovare dove altro BCEL esiste nel classpath e rimuoverlo.

+0

Questo è un grande suggestione @Zagrev (1) Io fare un tentativo in pochi minuti qui. Solo per curiosità, cosa ti ha fatto sospettare che fosse così? Lo chiedo solo perché non ci avrei pensato in 1.000 anni, e ha senso! (Ho aggiunto definitivamente questo JAR da qualche altra parte ...) – IAmYourFaja

+0

orribile, esperienza orribile :) – Zagrev

+0

Beh, ci è voluto un po ', ma ho esaminato ogni singolo file JAR sotto 'ANT_HOME/lib' così come nel mio FindBugs home directory, e che 'bcel-1.0.jar' è il * solo * JAR che contiene quella classe. Qualche altra idea ?? Grazie ancora! – IAmYourFaja

1

Potrebbe essere necessario definire un percorso AuxClass per includere il classpath utilizzato dall'attività <javac> durante la compilazione dei file di classe.

Non mostrare come la compilazione ha avuto luogo, così io parto dal presupposto che avete creato un riferimento compile.classapath percorso di classe:

<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

Grazie a @David W. (+1) - ha aggiunto il 'auxClasspath' e ha ancora lo stesso errore. Mi sento davvero come se Zagrev avesse qualcosa in comune con l'idea JAR duplicata, ma non riesco a trovarlo. Mi chiedo, c'è uno strumento là fuori che potrei puntare la mia directory ANT_HOME/lib a, e farlo stampare un elenco di ogni classe Java all'interno di ogni JAR in quella directory? In questo modo ho potuto scansionare l'output per le classi BCEL duplicate. – IAmYourFaja

+0

@pnongrata _ "c'è uno strumento là fuori che potrei puntare la mia directory ANT_HOME/lib a, e fargli stampare un elenco di ogni classe Java all'interno di ogni JAR in quella directory?" _ Dare un'occhiata a [Tattle Tale da JBoss] (http://www.jboss.org/tattletale). –

3

È possibile eseguire il debug in cui BCEL viene caricata di utilizzare il -verbose: argomento di classe a il jvm.

di passare questo argomento per la JVM in esecuzione findbugs, utilizzare il flag jvmargs sugli insetti trovare plug

jvmargs

attributo opzionale. Specifica gli argomenti che devono essere passati alla macchina virtuale Java utilizzata per eseguire FindBugs. Potrebbe essere necessario per utilizzare questo attributo per specificare i flag per aumentare la quantità di memoria che la JVM può utilizzare se si sta analizzando un programma molto grande.

Come hai popolato il bug di find lib jar? Quando scarico findbugs.zip, ottengo una directory lib che sembra molto diversa da quella che mostri. In particolare, il mio contiene un bcel con una versione di 5.3, non 1.0 come si mostra.

+0

Grazie a @sbridge controllerò - e sto usando Ant 1.8.4 – IAmYourFaja

+2

Penso che tu abbia la versione errata di bcel. Se scarico findbugs 2.0.1.zip, il bcel che include è 5.0.3 – sbridges

1

Non vedo dal tuo script Ant che bcel stia atterrando su qualsiasi classpath che l'attività findbugs sarebbe in grado di caricarlo da. Potresti provare a fare in modo che il tuo taskdef includa esplicitamente tutto ciò di cui ha bisogno findbugs.

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