19 Stimmen

Wie kann man eine fehlende Methode (Binäre Kompatibilität) in einem JAR statisch identifizieren?

Ich möchte die Binärkompatibilität zwischen 2 JARs überprüfen.

Nach den Vorschlägen in diesem Antwort Ich habe Jboss-Plaudertasche aber es kann nur fehlende Klassen finden.

Wie kann ich herausfinden, ob es fehlende Methoden gibt? Ist das überhaupt möglich?

z.B.

"Hängt ab - von" Klasse Foo hängt von Bar ab (wie viele andere Arbeitnehmer der Mittelschicht)

import org.overlyusedclassnames.Bar

public class Foo{
    public void someMethod(){
         Bar tender = new Bar();
         tender.getJohnnyRedLabel();
         tender.getJohnnyBlueLabel(); //this method is new in the Bar class
    }
}

Klasse "Kompilierzeit"

package org.overlyusedclassnames;

/** 
 * @Since 1992
 * Changes: added blue and gold Johnny Walker labels
 */

public class Bar {
    public Drink getJohnnyRedLabel(){
         return new JohnyWalkerFactory.get(RedLabel.class);
    }

    public Drink getJohnnyBlackLabel(){
         return new JohnyWalkerFactory.get(BlackLabel.class);
    }

    public Drink getJohnnyGoldLabel(){
         return new JohnyWalkerFactory.get(GoldLabel.class);
    }

    public Drink getJohnnyBlueLabel(){
         return new JohnyWalkerFactory.get(BlueLabel.class);
    }

}

Stellen Sie sich nun eine alt Bar jar ersetzt allmählich die kompilierte Zeitleiste:

Klasse "Laufzeit"

package org.overlyusedclassnames;

/** 
 * @Since 1909
 * Changes: added red and black Johnny Walker labels
 */

public class Bar {
    public Drink getJohnnyRedLabel(){
         return new JohnyWalkerFactory.get(RedLabel.class);
    }

    public Drink getJohnnyBlackLabel(){
         return new JohnyWalkerFactory.get(BlackLabel.class);
    }
}

Gibt es eine Möglichkeit, die fehlende Methode zu identifizieren, ohne sie auszuführen und eine NoSuchMethodError ?


Haftungsausschluss : Dies ist eine wesentliche Umformulierung meiner eigenen zugehörige Frage die nicht gelöscht werden kann. Ich habe mich dafür entschieden, eine neue Frage zu stellen, weil die Umformulierung die bisherigen 2 Antworten als völlig themenfremd erscheinen lassen wird.

17voto

linuxbuild Punkte 15460

japi-compliance-checker - Rückwärts-API/ABI-Kompatibilitätsprüfung für eine Java-Bibliothek:

japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar

enter image description here

sigtest - SigTest, das Signaturprüfungs- und API-Konformitätswerkzeug von Oracle

japitools - Test auf Kompatibilität zwischen Java-APIs

japi-checker - ein Java-API-Abwärtskompatibilitätsprüfprogramm, das auf Binärebene arbeitet

revapi - Werkzeug zur API-Analyse und Änderungsverfolgung

oder manuell mit dem javap-Decompiler:

javap OLD.class > OLD.txt
javap NEW.class > NEW.txt
diff -rNau OLD.txt NEW.txt > CHANGES.txt

3voto

linuxbuild Punkte 15460

Clirr - prüft Java-Bibliotheken auf Binär- und Quellcode-Kompatibilität mit älteren Versionen:

java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar

3voto

metlos Punkte 306

Revapi können diese Aufgabe ebenfalls erfüllen. Es ist einfach, es in Maven-Builds einzubinden, was natürlich nicht Ihr Fall ist, aber für andere von Interesse sein könnte.

Im Standalone-Modus können auch beliebige Mengen von Jars überprüft werden.

3voto

siom Punkte 1522

japicmp ist ein weiteres Werkzeug zur Überprüfung der Binärkompatibilität. Es ist als eigenständiges Kommandozeilenwerkzeug oder als Maven-Plugin verfügbar.

2voto

Michael Donohue Punkte 11704

Es gibt ein Tool mit dem Namen Tierschnüffler die es Ihnen ermöglicht, eine Signatur für eine API zu extrahieren. Dann kann statisch überprüft werden, ob die Nutzer der API sich an die Signatur halten, und es kann statisch überprüft werden, ob die Implementierer der API alles implementiert haben. Ich denke, das würde Ihr Problem gut lösen.

Sie können das jar für Animal Sniffer aus dem codehaus maven repository herunterladen: http://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X