Как сравнить два .jar файла? Оба они скомпилировали файлы .class.
Я хочу разницу в терминах изменений метода и т.д.
Как сравнить два .jar файла? Оба они скомпилировали файлы .class.
Я хочу разницу в терминах изменений метода и т.д.
JAPICC, использование примера:
japi-compliance-checker OLD.jar NEW.jar
Примеры отчетов для log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff, использование примера:
pkgdiff OLD.jar NEW.jar
См. образец отчета для args4j.
Clirr, использование примера:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Если вы выберите два файла в IntellijIdea и нажмите Ctrl + D
, тогда он покажет вам diff. Я использую Ultimate и не знаю, будет ли он работать с изданием Community.
Я использую в ZipDiff lib (есть как Java, так и ant API).
Извлеките каждый jar в свой каталог, используя команду jar с параметрами xvf. т.е. jar xvf myjar.jar
для каждой банки.
Затем используйте команду UNIX diff
для сравнения двух каталогов. Это покажет различия в каталогах. Вы можете использовать diff -r dir1 dir2
два рекурса и показать различия в текстовых файлах в каждом каталоге (.xml,.properties и т.д.).
Это также покажет, отличаются ли двоичные файлы классов. Чтобы действительно сравнить файлы классов, вам придется декомпилировать их, как отмечали другие.
В Linux/CygWin удобный script я использую время от времени:
#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
Вот мой script, чтобы выполнить процесс, описанный 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
Я могу запустить его в Windows с помощью GIT для Windows. Просто откройте командную строку. Запустите bash, а затем откройте script.
Используйте Java Decompiler, чтобы превратить файл jar в файл исходного кода, а затем используйте WinMerge для сравнения.
Вам следует проконсультироваться с владельцем авторского права исходного кода, чтобы убедиться, что это нормально.
Здесь представлен бесплатный инструмент http://www.extradata.com/products/jarc/
Попробуйте http://www.osjava.org/jardiff/ - инструмент старый, а список зависимостей большой. Из документов, похоже, стоит попробовать.
используйте java decompiler и декомпилируйте все .class файлы и сохраните все файлы в качестве структуры проекта.
затем используйте meld diff viewer и сравните их как папки.