2014-02-15 12 views
8

Ich installierte die Fedora 20 findbugs RPMs und meine Ant build.xml Datei thusly einrichten:FindBugs kann nicht gefunden werden org.apache.bcel.classfile.ClassFormatException

<property name="findbugs.home" location="/usr/share/findbugs"/> 

<target name="findbugs" description="static bytecode analysis"> 
    <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> 
    </taskdef> 

    <findbugs home="${findbugs.home}" output="xml" outputFile="bcel-fb.xml"> 
     <sourcePath path="${src.dir}"/> 
     <fileset dir="${build.dir}"> 
      <include name="**/*.class"/> 
     </fileset> 
    </findbugs> 
</target> 

Das gibt mir den Fehler:

java.lang.IllegalArgumentException: Can't find findbugs.jar in /usr/share/findbugs/lib

Also mache ich /usr/share/findbugs/lib eine symbolische Verbindung zu /usr/share/java, wo findbugs.jar lebt. Das bringt mich ein bisschen weiter, aber jetzt ist es ausspuckt:

findbugs: 
[findbugs] Executing findbugs from ant task 
[findbugs] Running FindBugs... 
[findbugs] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException 

strace zeigt, dass es gefunden und geöffnet /usr/share/java/findbugs-bcel.jar, so ich habe keine Ahnung, warum es nicht die Klasse laden. Das explizite Hinzufügen von /usr/share/java/findbugs-bcel.jar zum Klassenpfad des Taskdefs ändert nichts.

HINWEIS: Ich versuche nicht, FindBugs auf BCEL auszuführen. BCEL wird von FindBugs zur Analyse verwendet, und mein eigener Code verwendet BCEL überhaupt nicht.

+0

Findbugs verwendet es Version BCEL privat geändert own wird. Stellen Sie sicher, dass Ihr Klassenpfad den von Findbugs verwendet. – MeBigFatGuy

Antwort

5

Sie benötigen eine <Auxclasspath/> Untereigenschaft, die auf den Klassenpfad verweist, den Sie beim Kompilieren verwendet haben. Findbugs verwendet die erstellten *.class Dateien und benötigt die Quelle, um im Quellcode festzustellen, wo ein Fehler ist, welche Klassen Sie analysieren und den Klassenpfad zu allen Drittanbieter-JARs, um den Code zu verstehen:

in Ihrem <taskdef/>
<findbugs 
    home="${findbugs.home}" 
    output="xml" 
    outputFile="bcel-fb.xml"> 
    <auxClasspath refid="main.classpath"/> <!-- Third party jars classpath --> 
    <class location="${main.destdir}"/>  <!-- Class files you're analyzing --> 
    <sourcePath path="${main.srcdir}"/>  <!-- Source directory    --> 
</findbugs> 

By the way, sollten Sie die findbugs Glas in Ihrem Projekt setzen, dass und nutzen (Meine Präferenz unter ${basedir}/antlib/findbugs wäre):

<taskdef name="findbugs" 
    classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> 
    <classpath> 
     <fileset dir="${basedir}/antlib/findbugs"/> 
    </classpath> 
</taskdef> 

auf diese Weise findbugs Teil des Projekts ist. Jeder, der Ihr Projekt auscheckt, erhält automatisch das Findbugs-Jar und kann Ihre Findbugs-Aufgabe ausführen, ohne das JAR herunterladen und in $ANT_HOME/lib installieren zu müssen.

Ich mache dies mit beliebigen optionalen Ant-Task-Jars wie PMD, Checkstyle und Ant-Contrib. Es macht es viel einfacher für andere, meine Builds ausführen zu können, und ich verbringe weniger Zeit damit, den Leuten zu erklären, wo sie dieses Glas bekommen und wie man es installiert. Plus, wenn Sie ein Continuous Build System wie Jenkins verwenden, müssen Sie nicht mit dem Server fuzz, wenn Sie in einem neuen optionalen Glas hinzufügen.

+0

1) Ich habe versucht, das '' Element hinzuzufügen, und es hat nicht geholfen; gleicher Fehler wie zuvor. 2) Das Handbuch sagt, dass dieses Element "Ein optionales verschachteltes Element ist, das einen Klassenpfad angibt, der Klassen enthält, die von der analysierten Bibliothek oder Anwendung verwendet werden, die Sie jedoch nicht analysieren möchten". Ich benutze nicht die BCEL-Bibliothek in meiner App, also sehe ich nicht, warum es FindBugs helfen würde, eine der Bibliotheken * zu laden, * um * die * Analyse durchzuführen. –

1

Wenn findbugs haupt nicht gelegen: <property name="findbugs.home" location="/usr/share/findbugs"/>

würde ich Ihre Ant Findbugs Config auf den Speicherort der Dateien Findbug Bibliothek ändern:

<property name="findbugs.home" location="/usr/share/java"/> Oder auch, <property name="findbugs.home" location="/usr/share/java/findbugs"/> ist dies das Verzeichnis ist.

Es sieht wie ein Klassenpfadproblem aus.

+0

Ich habe versucht, die Findbugs zu Hause wie vorgeschlagen zu ändern, aber es hat nicht geholfen. Auch '/ usr/share/findbugs/etc/script.properties' enthält' findbugs_home =/usr/share/findbugs', also bin ich ziemlich sicher, dass '/ usr/share/findbugs' das richtige Zuhause ist. –

2

Versuchen Sie, diese unter Verwendung

Aufgabendefinition Hinzufügen

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

definieren Ziel

<property name="findbugs.home" value="/export/home/daveho/work/findbugs" /> 

    <target name="findbugs" depends="jar"> 
    <findbugs home="${findbugs.home}" 
       output="xml" 
       outputFile="bcel-fb.xml" > 
     <auxClasspath path="${basedir}/lib/Regex.jar" /> 
     <sourcePath path="${basedir}/src/java" /> 
     <class location="${basedir}/bin/bcel.jar" /> 
    </findbugs> 
    </target> 

Dieses Ziel wird FindBugs auf bcel.jar ausführen, die die JAR-Datei ist produziert von BCELs Build-Skript. (Indem wir es vom "jar" -Ziel abhängig machen, stellen wir sicher, dass die Bibliothek vollständig kompiliert wird, bevor FindBugs darauf ausgeführt wird.) Die Ausgabe von FindBugs wird im XML-Format in einer Datei namens bcel-fb.xml gespeichert. Eine Hilfs-Jar-Datei, Regex.jar, wird dem Aux-Klassenpfad hinzugefügt, da sie von der Haupt-BCEL-Bibliothek referenziert wird. Ein Quellpfad wird angegeben, damit die gespeicherten Fehlerdaten genaue Verweise auf den BCEL-Quellcode enthalten.

Für mehr info.

+0

@Matthew Cline Haben Sie es mit der obigen Lösung versucht> Stehen Sie immer noch vor Problemen? – Aditya

+0

Ich versuche nicht, FindBugs * auf * BCEL auszuführen, sondern FindBugs verwendet BCEL, um die Analyse meines eigenen Codes durchzuführen. –

+0

Es könnte sein, dass Sie die gleiche Version von Findbugs verwenden und die JAR-Datei bcel.jar nicht bcel-1.0.jar heißt. Sie führen auch Findbugs aus einem Ant-Skript aus. Versuchen Sie, die Findbugs noch einmal herunterzuladen, entpacken Sie sie an der Stelle Ihres aktuellen und führen Sie das Skript erneut aus. – Aditya

0

Findbugs verwendet eine eigene, privat modifizierte Version von BCEL. Stellen Sie sicher, dass Ihr Classpath den von Findbugs verwendet

+0

'strace' zeigt, dass es erfolgreich seine eigene BCEL-JAR-Datei öffnet, so dass das nicht das Problem ist. –

1

Laut Richard Fearn [1] packt Fedora findbugs jars und ändert die Art und Weise, wie die FB-Bibliothek Klassen geladen werden, also mithilfe von Findbugs von Fedora muss man die unten beschriebene Problemumgehung verwenden. Siehe auch [2] für die ursprüngliche Fehleranforderung bei findbugs.

Zitat aus [1]:

As a workaround it's possible to do this:

<findbugs classpath="/usr/share/java/findbugs.jar:/usr/share/java/ant/ant-findbugs.jar:/usr/share/java/apache-commons-lang.jar:/usr/share/java/dom4j.jar:/usr/share/java/findbugs-bcel.jar:/usr/share/java/jaxen.jar:/usr/share/java/jcip-annotations.jar:/usr/share/java/jFormatString.jar:/usr/share/java/jsr-305.jar:/usr/share/java/junit.jar:/usr/share/java/objectweb-asm/asm.jar:/usr/share/java/objectweb-asm/asm-commons.jar:/usr/share/java/objectweb-asm/asm-tree.jar"> 

where that classpath is the output from:

$ build-classpath cat /etc/ant.d/findbugs

[1] https://bugzilla.redhat.com/show_bug.cgi?id=1080682#c4

[2] https://sourceforge.net/p/findbugs/bugs/1255/

1

Auch wenn es nicht genau dem Fedora-Paket Fall in der Frage übereinstimmt, traf ich dieses gleiche Problem versuchen, FindBugs (3.0.1) mit Ivy abzurufen, anstatt es aus der .zip-Distribution zu installieren. Es scheint eine Reihe von Miss-Übereinstimmungen zwischen dem, was abgerufen wird und was erwartet wird, zu erwarten.

Am Ende habe ich diese Abhängigkeit in meinem ivy.xml verwendet:

<dependency org="com.google.code.findbugs" name="findbugs" rev="3.0.1" conf="findbugs->default" /> 

mit folgendem in meiner Ameise build.xml (innerhalb eines 'Bootstrap' Aufgabe, die alle Werkzeuge einrichtet):

<property name="findbugs.home" value="${basedir}/tools/findbugs" /> 
<property name="findbugs.lib" value="${findbugs.home}/lib" /> 
<ivy:resolve file="${basedir}/tools/ivy.xml" conf="findbugs" trransitive="true"/> 
<ivy:retrieve conf="findbugs" transitive="true" pattern="${findbugs.lib}/[artifact]-[revision].[ext]"/> 

Das ist wie ein Baum gibt:

AppleJavaExtensions-1.4.jar 
asm-5.0.2.jar 
asm-commons-5.0.2.jar 
asm-debug-all-5.0.2.jar 
asm-tree-5.0.2.jar 
bcel-findbugs-6.0.jar 
commons-lang-2.6.jar 
dom4j-1.6.1.jar 
findbugs-3.0.1.jar 
jaxen-1.1.6.jar 
jcip-annotations-1.0.jar 
jFormatString-2.0.1.jar 
jsr305-2.0.1.jar 
xml-apis-1.0.b2.jar 

Der Schlüssel das Problem, dasszu lösen, istwill den Classpath in seinem eigenen MANIFEST.MF angegeben verwenden:

Class-Path: bcel-6.0-SNAPSHOT.jar dom4j-1.6.1.jar jaxen-1.1.6.jar asm-debug-all-5.0.2.jar jsr305.jar jFormatString.jar commons-lang-2.6.jar 

es auch will findbugs.jar sonst tritt ein anderer Fehler benannt werden. Daher umbenennen Sie nach dem Ivy-Schritt.Gläser Ant mit:

<move file="${findbugs.lib}/findbugs-3.0.1.jar" tofile="${findbugs.lib}/findbugs.jar"/> 
    <move file="${findbugs.lib}/jFormatString-2.0.1.jar" tofile="${findbugs.lib}/jFormatString.jar"/> 
    <move file="${findbugs.lib}/jsr305-2.0.1.jar" tofile="${findbugs.lib}/jsr305.jar"/> 
    <move file="${findbugs.lib}/bcel-findbugs-6.0.jar" tofile="${findbugs.lib}/bcel-6.0-SNAPSHOT.jar"/> 

schließlich die Ant taskdef definieren:

<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> 
     <classpath> 
      <fileset dir="${findbugs.lib}" includes="*.jar" /> 
     </classpath> 
    </taskdef>