Как сравнить два файла .jar? Оба они скомпилировали файлы .class.
Я хочу разницу в изменении методов и т. Д.
java
jar
comparison
diff
Кунал
источник
источник
Если вы выберете два файла в IntellijIdea и нажмете,
Ctrl + D
он покажет вам разницу. Я использую Ultimate и не знаю, будет ли он работать с версией Community .источник
источник
jar
для извлечения содержимого, вместо того, чтобы переименовывать файл и использоватьpkunzip
.)javap -c
сохранить его в байт-коде (особенно, если под «изменением метода» OP подразумевает изменение подписи метода).diff
Ing вjavap
илиjad
выход из ежик.Я использую для ZipDiff lib (есть как Java, так и ant API).
источник
Извлеките каждую банку в ее собственный каталог с помощью команды 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/ - инструмент старый, а список зависимостей большой. Судя по документации, похоже, стоит попробовать.
источник