Risposte:
JAPICC , utilizzo di esempio:
japi-compliance-checker OLD.jar NEW.jar
Rapporti di esempio per log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , utilizzo di esempio:
pkgdiff OLD.jar NEW.jar
Vedere il report di esempio per args4j.
Clirr , utilizzo di esempio:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Se selezioni due file in IntellijIdea e premi Ctrl + D
, ti mostrerà il diff. Uso Ultimate e non so se funzionerà con l' edizione Community .
jar
per estrarre il contenuto, invece di rinominare il file e usarlo pkunzip
.)
javap -c
per mantenerlo in bytecode (specialmente se con "modifiche al metodo" l'OP significava modifiche alla firma di un metodo).
diff
l'ing del javap
o jad
uscita fuori Whack.
Estrai ogni jar nella sua directory usando 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 ricorsioni e mostrare le differenze nei file di testo in ogni directory (.xml, .properties, ecc.).
Questo mostrerà anche se i file di classe binaria differiscono. Per confrontare effettivamente i file di classe dovrai decompilarli come notato da altri.
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
${DIFF} ${EXT_DIR1} ${EXT_DIR2}
Posso eseguirlo su Windows usando GIT per Windows. Basta aprire un prompt dei comandi. Esegui bash e quindi esegui lo script da lì.
diff -r ${EXT_DIR1} ${EXT_DIR2}
o ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(se riutilizzi la tua variabile dichiarata). Per coloro che sono su cygwin, lo script ha quasi funzionato per me tranne due cose che ho cambiato: 1) Ho dovuto usare javap integrato invece di jad, perché non posso scaricare jad (enterp. Firewall ... ); 2) come jar xf
does't capire come i percorsi /cygwin/c/rest/of/path
che viene restituito da pwd
in Cygwin, ho dovuto convertirlo in c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? Non ho quel binario disponibile in PATH
foo/bar/toto.jar
), devi aggiungere l' -p
argomento al comando mkdir
In Linux / CygWin un pratico script 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
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 è corretto farlo.
usa il decompilatore java e decompila tutti i file .class e salva tutti i file come struttura del progetto.
quindi usa il visualizzatore di differenze di fusione e confronta come cartelle ..
Ecco uno strumento apparentemente gratuito http://www.extradata.com/products/jarc/
Prova http://www.osjava.org/jardiff/ - lo strumento è vecchio e l'elenco delle dipendenze è grande. Dai documenti, sembra che valga la pena provare.