Ich habe die Fedora 20 findbugs RPMs installiert und meine Ant build.xml
-Datei so eingerichtet:
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:
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.
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:
Ü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/>
:
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.
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
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.
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] Ссылка
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:
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:
Definieren Sie abschließend den Ant-Taskdef:
%Vor%Findbugs verwendet seine eigene, privat modifizierte Version von BCEL. Vergewissern Sie sich, dass Ihr Klassenpfad den von Findbugs
verwendet