Frage

Ich mag binäre Kompatibilität zwischen zwei JAR-Dateien überprüfen.

Im Anschluss an die Vorschläge in dieser Antwort I verwendet Jboss tattletale aber es kann nur fehlende Klassen finden.

Wie kann ich feststellen, ob es fehlen Methoden? Ist es möglich?

z.

"Hängt - auf" Klasse Foo hängt von Bar (wie viele andere Mittelschicht Arbeiter)

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

"Compile time" Klasse

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);
    }

}

Nun stellen Sie ein alt Bar jar accedently wird die kompilierte Zeitleiste zu ersetzen:

"Runtime time" Klasse

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 fehlenden Methode zu identifizieren, ohne sie läuft und eine NoSuchMethodError bekommen?


Hinweis : Dies ist eine wichtige Umformulierung meines eigenen verwandte Frage , die undeletable ist. Ich entschied ich für eine neue Frage zu stellen, weil die Umformulierung der aktuellen 2 Antworten, wie recht keinen Bezug zum Thema machen wird.

War es hilfreich?

Lösung

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

 image description hier

eingeben

sigtest - SigTest Signaturprüfung und API-Konformität Tool von Oracle

japitools - Test für die Kompatibilität zwischen Java-APIs

japi-checker - eine Java-API rückwärts Kompatibilitätsprüfung, die auf binärer Ebene arbeitet

revapi - API Analyse und Änderung Tracking-Tool

oder manuell mit javap Decompiler:

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

Andere Tipps

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

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

Revapi können den Job auch tun. Es ist leicht zu integrieren in Maven baut, was natürlich nicht der Fall ist, aber vielleicht für andere von Interesse sein.

Es kann auch beliebige Mengen von Gläsern mit seinem Standalone-Modus überprüfen.

japicmp ist ein weiteres Tool für die binäre Kompatibilität zu überprüfen. Es ist als Standalone-Kommandozeilen-Tool oder als Maven Plugin.

Es ist ein Werkzeug, mit dem Namen Tier Sniffer , dass Sie ein extrahieren Signatur für ein API. Dann kann es statisch, dass die Nutzer des API-Sticks auf die Signatur überprüfen, und es kann, dass der implementors des API hat alles umgesetzt statisch überprüfen. Ich denke, das Ihr Problem gut lösen würde.

Sie können das Glas für Tier Sniffer Download aus dem Codehaus Maven-Repository: http://repo1.maven.org/maven2/org/codehaus / mojo / Tier-Sniffer /

Sie benötigen eine eine bestimmte Klasse oder ein generisches Werkzeug zu prüfen jar ist für den Vergleich? Wenn es für 1 Klasse ist, laden Sie einfach die Klasse in einem benutzerdefinierten Klassenlader, überprüfen Sie die Methoden Unterzeichnung durch Reflexion mit und das ist es. Wenn Sie es für viele JAR / der Klassen benötigt, dies zu viel Arbeit sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top