Come identificare un metodo mancante (compatibilità binaria) in un JAR staticamente
-
19-09-2019 - |
Domanda
Voglio verificare la compatibilità binaria tra 2 vasetti.
Seguendo i suggerimenti in questo rispondere ho usato JBoss tattletale ma può trovare le classi solo mancanti.
Come faccio a sapere se ci sono metodi mancanti? E 'possibile a tutti?
per es.
"Dipende - sulla" class Foo dipende Bar (come molti altri lavoratori della classe media)
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
}
}
"Tempo di compilazione" class
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);
}
}
Ora immaginate un vecchia vaso Bar si accedently sostituendo la barra del tempo compilato:
class "Runtime tempo"
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);
}
}
C'è un modo per identificare il metodo mancante senza correre e ottenere un NoSuchMethodError
?
responsabilità : Questo è un importante riformulazione della mia domanda relativa , che è incancellabile. Ho scelto di fare una nuova domanda, perché la riformulazione renderà gli attuali 2 risposte come del tutto estranei al tema.
Soluzione
JAPI-compliance-checker - API indietro / ABI verifica della compatibilità di una libreria Java :
japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar
sigtest - Oracle SigTest test firma e strumento di conformità API
japitools - test per la compatibilità tra API Java
JAPI-checker - Un'API Java all'indietro checker compatibilità che opera a livello binario
revapi - analisi API e cambiare strumento di monitoraggio
o manualmente utilizzando javap decompilatore:
javap OLD.class > OLD.txt javap NEW.class > NEW.txt diff -rNau OLD.txt NEW.txt > CHANGES.txt
Altri suggerimenti
Clirr - assegni librerie Java per binaria e sorgente di compatibilità con le versioni precedenti:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Revapi può fare il lavoro, anche. E 'facile da integrare in Maven costruisce, che non è il vostro caso, ovviamente, ma potrebbe essere di interesse per gli altri.
Si può anche verificare insiemi arbitrari di vasi utilizzando la sua modalità autonoma.
japicmp è un altro strumento per verificare la compatibilità binaria. È disponibile come stand-alone strumento da riga di comando o come plug-in Maven.
Non è uno strumento con il nome di animali Sniffer che permette di estrarre un firma per un'API. Poi si può verificare staticamente che gli utenti delle API attaccano alla firma, ed è in grado di verificare in modo statico che implementatori delle API hanno tutto implementato. Penso che questo risolverebbe il problema bene.
È possibile scaricare il vaso per Sniffer Animal dal repository Maven Codehaus: http://repo1.maven.org/maven2/org/codehaus / Mojo / animale-sniffer /
Avete bisogno di un controllo ad una classe specifica o di uno strumento generico per il confronto vaso di? Se è per 1 classe, è sufficiente caricare la classe in una classe personalizzata caricatore, controllare la firma metodi utilizzando la riflessione e il gioco è fatto. Se ne avete bisogno per molti JAR di / Classi questo sarà troppo lavoro.