İki .jar dosyasını nasıl karşılaştırırım? Her ikisi de .class dosyalarını derledi.
Yöntem değişikliği vb. Açısından farkı istiyorum.
Yanıtlar:
JAPICC , örnek kullanım:
japi-compliance-checker OLD.jar NEW.jar
Log4j için örnek raporlar: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , örnek kullanım:
pkgdiff OLD.jar NEW.jar
Args4j için örnek rapora bakın .
Clirr , örnek kullanım:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
IntellijIdea'da iki dosya seçip tuşuna basarsanız, Ctrl + D
bu size farkı gösterecektir. Kullandığım Ultimate ve birlikte çalışacaktır bilmiyorum Topluluk baskısında.
jar
Dosyayı yeniden adlandırıp kullanmak yerine içeriği çıkarmak için kullanabileceğim dışında pkunzip
.)
javap -c
bayt kodunda tutmak için bir çağrı ile değiştirin (özellikle "yöntem değişiklikleri" ile OP, bir yöntemin imzasında değişiklik anlamına geliyorsa).
diff
ait ing javap
veya jad
vurmak dışına çıkışını.
Xvf parametreleriyle jar komutunu kullanarak her bir kavanozu kendi dizinine çıkarın. yani jar xvf myjar.jar
her kavanoz için.
Ardından, diff
iki dizini karşılaştırmak için UNIX komutunu kullanın. Bu, dizinlerdeki farklılıkları gösterecektir. diff -r dir1 dir2
İki yineleme kullanabilir ve her dizindeki metin dosyalarındaki farklılıkları gösterebilirsiniz (.xml, .properties, vb.).
Bu ayrıca ikili sınıf dosyalarının farklı olup olmadığını da gösterecektir. Sınıf dosyalarını gerçekten karşılaştırmak için, onları başkaları tarafından belirtildiği gibi yeniden derlemeniz gerekir.
İşte sje397 tarafından açıklanan işlemi yapmak için betiğim:
#!/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}
Windows için GIT kullanarak Windows'ta çalıştırabilirim. Sadece bir komut istemi açın. Bash'ı çalıştırın ve ardından betiği oradan çalıştırın.
diff -r ${EXT_DIR1} ${EXT_DIR2}
veya ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(beyan edilen değişkeni yeniden kullanıyorsanız). Cygwin kullananlar için, değiştirdiğim iki şey dışında komut dosyası neredeyse benim için çalıştı: 1) jad (enterp. Firewall) indiremediğim için jad yerine yerleşik javap kullanmak zorunda kaldım. ); 2) olarak jar xf
does't gibi yolları anlamaya /cygwin/c/rest/of/path
hangi döndürülen pwd
cygwin içinde, ben dönüştürmek zorunda c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? Bu ikilinin
foo/bar/toto.jar
) olması durumunda, -p
mkdir komutuna argümanı eklemeniz gerekir
Jar dosyasını kaynak kod dosyasına dönüştürmek için Java Decompiler'ı kullanın ve ardından karşılaştırma yapmak için WinMerge'i kullanın.
Bunu yapmanın uygun olup olmadığını görmek için kaynak kodun telif hakkı sahibine danışmalısınız.
Linux / CygWin'de bazen kullandığım kullanışlı bir betik:
#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
java decompiler'ı kullanın ve tüm .class dosyalarını derleyin ve tüm dosyaları proje yapısı olarak kaydedin.
ardından meld diff görüntüleyiciyi kullanın ve klasörler olarak karşılaştırın ..
Görünürde ücretsiz bir araç http://www.extradata.com/products/jarc/
Lütfen http://www.osjava.org/jardiff/ adresini deneyin - araç eski ve bağımlılık listesi büyük. Dokümanlardan denemeye değer gibi görünüyor.