Відповіді:
JAPICC , використання зразка:
japi-compliance-checker OLD.jar NEW.jar
Зразок звітів для log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , використання вибірки:
pkgdiff OLD.jar NEW.jar
Дивіться зразок звіту для args4j.
Клірр , використання зразка:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Якщо ви виберете два файли в IntellijIdea і натисніть, Ctrl + Dто він покаже вам різницю. Я використовую Ultimate і не знаю, чи буде це працювати з виданням Community .
jarдля вилучення вмісту, замість того, щоб перейменувати файл і використовувати pkunzip.)
javap -cтримати його в байт-коді (особливо якщо "зміна методу" ОП означала зміни в підписі методу).
diffIng в javapабо jadвихід з їжачок.
Витягніть кожен jar у свій власний каталог за допомогою команди jar з параметрами xvf. тобто jar xvf myjar.jarдля кожної банки.
Потім за допомогою команди UNIX diffпорівняйте два каталоги. Це покаже відмінності в каталогах. Ви можете використовувати diff -r dir1 dir2два повторення та показувати відмінності в текстових файлах у кожному каталозі (.xml, .properties тощо).
Це також покаже, якщо файли бінарних класів відрізняються. Для фактичного порівняння файлів класів вам доведеться їх декомпілювати, як зазначають інші.
Ось мій сценарій, щоб виконати процес, описаний 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}
Я можу запустити його в Windows за допомогою GIT для Windows. Просто відкрийте командний рядок. Запустіть bash і виконайте звідти сценарій.
diff -r ${EXT_DIR1} ${EXT_DIR2}або ${DIFF} ${EXT_DIR1} ${EXT_DIR2}(у разі повторного використання заявленої змінної). Для тих, хто перебуває на cygwin, сценарій майже працював для мене, за винятком двох речей, які я змінив: 1) Мені довелося використовувати вбудований javap замість jad, тому що я не можу завантажити jad (enterp. Firewall ... ); 2) в якості jar xfdoes't зрозуміти шляхи , як , /cygwin/c/rest/of/pathякий повертається pwdв Cygwin, я повинен був перетворити його в c:/rest/of/path: JAR_DIR=${PWD}, JAR_DIR=${JAR_DIR#*/cygdrive/c},JAR_DIR="c:$JAR_DIR"
jad?
foo/bar/toto.jar), вам потрібно додати -pаргумент до команди mkdir
У Linux / CygWin зручним сценарієм, який я використовую часом, є:
#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, щоб перетворити файл jar у файл вихідного коду, а потім використовуйте WinMerge для порівняння.
Потрібно проконсультуватися з власником авторських прав на вихідний код, щоб побачити, чи правильно це робити.
використовувати Java-декомпілятор та декомпілювати всі файли .class та зберегти всі файли як структуру проекту.
потім скористайтеся засобом перегляду різниць та порівняйте як папки ..
Ось очевидно безкоштовний інструмент http://www.extradata.com/products/jarc/
Спробуйте http://www.osjava.org/jardiff/ - інструмент старий, а список залежностей великий. З документів, схоже, варто спробувати.