Come faccio a confrontare due file .jar? Entrambi hanno compilato file .class.
Voglio la differenza in termini di cambi di metodo, ecc.
JAPICC , utilizzo del campione:
japi-compliance-checker OLD.jar NEW.jar
Rapporti di esempio per log4j: http://abi-laboratory.pro/Java/tracker/timeline/log4j/
PkgDiff , utilizzo campione:
pkgdiff OLD.jar NEW.jar
Vedi rapporto di esempio per args4j.
Clirr , utilizzo campione:
Java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Se selezioni due file in IntellijIdea e premi Ctrl + D
quindi ti mostrerà il diff. Uso Ultimate e non so se funzionerà con Community edizione.
Uso ZipDiff lib (ho entrambi Java e ant API).
Estrarre ogni jar nella propria directory utilizzando il comando jar con i parametri xvf. cioè jar xvf myjar.jar
per ogni barattolo.
Quindi, utilizzare il comando UNIX diff
per confrontare le due directory. Questo mostrerà le differenze nelle directory. Puoi usare diff -r dir1 dir2
due recurse e mostrano le differenze nei file di testo in ciascuna directory (.xml, .properties, ecc.).
Ciò mostrerà anche se i file di classe binari differiscono. Per confrontare effettivamente i file di classe dovrai decompilarli come notato da altri.
In Linux/CygWin uno script utile che uso a volte è:
#Extract the jar (war or ear)
cd dir1
jar xvf jar-file1
for i in `ls *.class`
do
javap $i > ${i}.txt #list the functions/variables etc
done
cd dir2
jar xvf jar-file2
for i in `ls *.class`
do
javap $i > ${i}.txt #list the functions/variables etc
done
diff -r dir1 dir2 #diff recursively
Ecco il mio script per eseguire il processo descritto da sje397:
#!/bin/sh
# Needed if running on Windows
FIND="/usr/bin/find"
DIFF="diff -r"
# Extract the jar (war or ear)
JAR_FILE1=$1
JAR_FILE2=$2
JAR_DIR=${PWD} # to assign to a variable
TEMP_DIR=$(mktemp -d)
echo "Extracting jars in $TEMP_DIR"
EXT_DIR1="${TEMP_DIR}/${JAR_FILE1%.*}"
EXT_DIR2="${TEMP_DIR}/${JAR_FILE2%.*}"
mkdir ${EXT_DIR1}
cd ${EXT_DIR1}
jar xf ${JAR_DIR}/${JAR_FILE1}
jad -d . -o -t2 -safe -space -b -ff -s Java -r **/*.class
cd ..
mkdir ${EXT_DIR2}
cd ${EXT_DIR2}
jar xf ${JAR_DIR}/${JAR_FILE2}
jad -d . -o -t2 -safe -space -b -ff -s Java -r **/*.class
cd ..
# remove class files so the diff is clean
${FIND} ${TEMP_DIR} -name '*.class' | xargs rm
# diff recursively
Posso eseguirlo su Windows usando GIT per Windows. Basta aprire un prompt dei comandi. Esegui bash e quindi esegui lo script da lì.
Utilizzare Java Decompiler per trasformare il file jar in file di codice sorgente, quindi utilizzare WinMerge per eseguire il confronto.
Dovresti consultare il detentore del copyright del codice sorgente, per vedere se è OK farlo.
Prova http://www.osjava.org/jardiff/ - lo strumento è vecchio e l'elenco delle dipendenze è grande. Dai documenti, sembra che valga la pena provare.
Ecco uno strumento altrettanto gratuito http://www.extradata.com/products/jarc/
usa Java decompiler e decompila tutti i file .class e salva tutti i file come struttura del progetto.
quindi usa meld diff viewer e confronta come cartelle ..