Bagaimana cara membandingkan dua file .jar? Keduanya telah mengkompilasi file .class.
Saya ingin perbedaan dalam hal perubahan metode, dll.
Jawaban:
JAPICC , penggunaan sampel:
japi-compliance-checker OLD.jar NEW.jar
Contoh laporan untuk log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , penggunaan sampel:
pkgdiff OLD.jar NEW.jar
Lihat contoh laporan untuk args4j.
Clirr , penggunaan sampel:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Jika Anda memilih dua file di IntellijIdea dan menekannya, Ctrl + D
maka Anda akan melihat perbedaannya. Saya menggunakan Ultimate dan tidak tahu apakah itu akan berfungsi dengan edisi Komunitas .
jar
untuk mengekstrak konten, alih-alih mengganti nama file dan menggunakan pkunzip
.)
javap -c
menyimpannya ke bytecode (terutama jika dengan "perubahan metode", OP berarti perubahan pada tanda tangan metode).
diff
ing dari javap
atau jad
keluaran dari mendera.
Ekstrak setiap jar ke direktorinya sendiri menggunakan perintah jar dengan parameter xvf. yaitujar xvf myjar.jar
untuk setiap toples.
Kemudian, gunakan perintah UNIX diff
untuk membandingkan dua direktori. Ini akan menunjukkan perbedaan direktori. Anda dapat menggunakan diff -r dir1 dir2
dua pengulangan dan menunjukkan perbedaan file teks di setiap direktori (.xml, .properties, dll).
Ini juga akan menunjukkan jika file kelas biner berbeda. Untuk benar-benar membandingkan file kelas Anda harus mendekompilasi mereka seperti yang dicatat oleh orang lain.
Berikut ini skrip saya untuk melakukan proses yang dijelaskan oleh 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}
Saya dapat menjalankannya di Windows menggunakan GIT untuk Windows. Buka saja prompt perintah. Jalankan bash dan kemudian jalankan skrip dari sana.
diff -r ${EXT_DIR1} ${EXT_DIR2}
atau ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(jika menggunakan kembali variabel yang Anda deklarasikan). Bagi mereka yang menggunakan cygwin, skripnya hampir berfungsi untuk saya kecuali dua hal yang telah saya ubah: 1) Saya harus menggunakan javap bawaan daripada jad, karena saya tidak dapat mengunduh jad (enterp. Firewall ... ); 2) sebagai jar xf
does't memahami jalur seperti /cygwin/c/rest/of/path
yang dikembalikan oleh pwd
di cygwin, saya harus mengubahnya menjadi c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? Tidak memiliki biner yang tersedia di PATH
foo/bar/toto.jar
), Anda perlu menambahkan -p
argumen ke perintah mkdir
Di Linux / CygWin, skrip praktis yang terkadang saya gunakan adalah:
#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
Gunakan Java Decompiler untuk mengubah file jar menjadi file kode sumber, dan kemudian gunakan WinMerge untuk melakukan perbandingan.
Anda harus berkonsultasi dengan pemegang hak cipta dari kode sumber, untuk mengetahui apakah boleh dilakukan.
gunakan java decompiler dan dekompilasi semua file .class dan simpan semua file sebagai struktur proyek.
lalu gunakan meld diff viewer dan bandingkan sebagai folder ..
Ini alat yang benar-benar gratis http://www.extradata.com/products/jarc/
Silakan coba http://www.osjava.org/jardiff/ - alat sudah tua dan daftar ketergantungannya besar. Dari dokumen, sepertinya patut dicoba.