Сравнение двух файлов .jar - PullRequest
       40

Сравнение двух файлов .jar

87 голосов
/ 06 октября 2010

Как сравнить два файла .jar? Оба они скомпилировали файлы .class.

Мне нужна разница с точки зрения изменений метода и т. Д.

Ответы [ 11 ]

89 голосов
/ 13 февраля 2012
18 голосов
/ 06 октября 2010
  1. Переименовать .jar в .zip
  2. Извлечь
  3. Декомпилировать файлы классов с jad
  4. Рекурсивно diff
14 голосов
/ 22 июня 2017

Если вы выберете два файла в IntellijIdea и нажмете Ctrl + D, то он покажет вам разницу.Я использую Ultimate и не знаю, будет ли он работать с Community edition.

5 голосов
/ 02 февраля 2012

Я использую для ZipDiff lib (есть как Java, так и ant API).

4 голосов
/ 06 октября 2010

Извлеките каждый jar в свой каталог, используя команду jar с параметрами xvf.т.е. jar xvf myjar.jar для каждой банки.

Затем используйте команду UNIX diff для сравнения двух каталогов.Это покажет различия в каталогах.Вы можете использовать diff -r dir1 dir2 два рекурса и показать различия в текстовых файлах в каждом каталоге (.xml, .properties и т. Д.).

Это также покажет, отличаются ли файлы двоичных классов.Чтобы реально сравнить файлы классов, вам придется декомпилировать их, как отмечали другие.

2 голосов
/ 24 января 2017

Вот мой скрипт для выполнения процесса, описанного 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, а затем выполните скрипт оттуда.

2 голосов
/ 26 марта 2015

В 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
1 голос
/ 06 октября 2010

Используйте Java Decompiler , чтобы превратить файл JAR в файл исходного кода, а затем используйте WinMerge для выполнения сравнения.

Вы должны проконсультироваться с правообладателемисходный код, чтобы увидеть, нормально ли это делать.

0 голосов
/ 19 января 2016

используйте декомпилятор Java , декомпилируйте все файлы .class и сохраните все файлы как структуру проекта.

, затем используйте meld diff viewer и сравнивайте как папки ..

0 голосов
/ 06 октября 2010

Пожалуйста, попробуйте http://www.osjava.org/jardiff/ - инструмент старый и список зависимостей большой.Из документов, похоже, стоит попробовать.

...