Wie eine fehlende Methode (Binary Compatibility) in einem JAR identifizieren statisch
-
19-09-2019 - |
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.
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
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.