Как сравнить два файла .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
он покажет вам разницу. Я использую Ultimate и не знаю, будет ли он работать с версией Community .
jar
для извлечения содержимого, вместо того, чтобы переименовывать файл и использовать pkunzip
.)
javap -c
сохранить его в байт-коде (особенно, если под «изменением метода» OP подразумевает изменение подписи метода).
diff
Ing в javap
или jad
выход из ежик.
Извлеките каждую банку в ее собственный каталог с помощью команды 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 и сохраните все файлы как структуру проекта.
затем используйте meld diff viewer и сравните как папки ..
Вот, по-видимому, бесплатный инструмент http://www.extradata.com/products/jarc/
Пожалуйста, попробуйте http://www.osjava.org/jardiff/ - инструмент старый, а список зависимостей большой. Судя по документации, похоже, стоит попробовать.