Відповіді:
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
тримати його в байт-коді (особливо якщо "зміна методу" ОП означала зміни в підписі методу).
diff
Ing в 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 xf
does'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/ - інструмент старий, а список залежностей великий. З документів, схоже, варто спробувати.