FindBugs kann org.apache.bcel.classfile.ClassFormatException nicht finden

8

Ich habe die Fedora 20 findbugs RPMs installiert und meine Ant build.xml -Datei so eingerichtet:

%Vor%

Das gibt mir den Fehler:

  

java.lang.IllegalArgumentException: findbugs.jar kann nicht in / usr / share / findbugs / lib gefunden werden

Also mache ich /usr/share/findbugs/lib zu einem symbolischen Link zu /usr/share/java , wo findbugs.jar lebt. Das bringt mich ein bisschen weiter, aber jetzt spuckt es aus:

%Vor%

strace zeigt an, dass es /usr/share/java/findbugs-bcel.jar gefunden und geöffnet hat, also habe ich keine Ahnung, warum es die Klasse nicht laden kann. 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.

    
Matthew Cline 15.02.2014, 09:25
quelle

6 Antworten

5

Sie benötigen eine <Auxclasspath/> -Untereinheit, die auf den Klassenpfad verweist, den Sie beim Kompilieren verwendet haben. Findbugs verwendet die eingebauten *.class -Dateien und benötigt die Quelle, um im Quellcode, wo ein Fehler ist, die zu analysierenden Klassen und den Klassenpfad zu allen Drittanbieter-JARs zu lokalisieren, um den Code verstehen zu können:

%Vor%

Übrigens sollten Sie das Findbugs-Glas in Ihr Projekt einfügen (Meine Präferenz wäre unter ${basedir}/antlib/findbugs ) und verwenden Sie das in Ihrem <taskdef/> :

%Vor%

Auf diese Weise ist Findbugs Teil Ihres Projekts. 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 das 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. Außerdem, wenn Sie ein Continuous Build System wie Jenkins verwenden, müssen Sie nicht mit dem Server fuzz, wenn Sie in einem neuen optionalen Krug hinzufügen.

    
David W. 18.02.2014 01:17
quelle
2

Probieren Sie dies aus,

Taskdefinition hinzufügen

%Vor%

Ziel definieren

%Vor%

Dieses Ziel führt FindBugs auf bcel.jar aus. Dies ist die Jar-Datei, die von BCELs Build-Skript erzeugt wird. (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.

Weitere Informationen

    
Aditya 24.02.2014 12:26
quelle
1

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

Ich würde Ihre Ant-Findbugs-Konfiguration in den Speicherort der Findbug-Bibliotheksdateien ändern:

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

Es sieht wie ein Klassenpfadproblem aus.

    
user2691041 22.02.2014 21:50
quelle
1

Nach Richard Fearn [1] packt Fedora findbugs jar und ändert die Art und Weise, wie die FB-Bibliotheksklassen geladen werden. Daher muss man bei der Verwendung von findbugs von fedora die unten beschriebene Problemumgehung verwenden. Siehe auch [2] für die ursprüngliche Fehleranforderung bei findbugs.

Zitat aus [1]:

  

Als Workaround ist es möglich:

%Vor%      

wobei der Klassenpfad die Ausgabe von:

ist      

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

[1] Ссылка

[2] Ссылка

    
Andrey Loskutov 21.04.2014 07:08
quelle
1

Obwohl ich in der Frage nicht genau mit dem Fall des Fedora-Pakets übereinstimme, habe ich das gleiche Problem bei dem Versuch, FindBugs (3.0.1) mit Ivy zu holen, 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 meiner efeu.xml verwendet:

%Vor%

mit dem folgenden in meiner ant build.xml (innerhalb einer 'bootstrap' Aufgabe, die alle Werkzeuge einrichtet):

%Vor%

Dies ergibt einen Baum wie:

%Vor%

Der Schlüssel zur Lösung des Problems ist, dass findbugs-3.0.1.jar den Klassenpfad verwenden möchte, der in seiner eigenen MANIFEST.MF angegeben ist:

%Vor%

Er möchte auch den Namen findbugs.jar haben, ansonsten tritt ein anderer Fehler auf. Benennen Sie nach dem Ivy-Schritt die .jars mit Ant:

um %Vor%

Definieren Sie abschließend den Ant-Taskdef:

%Vor%     
Ed Randall 01.08.2016 18:00
quelle
0

Findbugs verwendet seine eigene, privat modifizierte Version von BCEL. Vergewissern Sie sich, dass Ihr Klassenpfad den von Findbugs

verwendet     
MeBigFatGuy 06.03.2014 06:00
quelle

Tags und Links