[java] 두 .jar 파일 비교

두 개의 .jar 파일을 어떻게 비교합니까? 둘 다 .class 파일을 컴파일했습니다.

방법 변경 등의 차이를 원합니다.



답변


답변

IntellijIdea 에서 두 개의 파일을 선택 하고를 누르면 Ctrl + D차이점이 표시됩니다. Ultimate를 사용하는데 Community Edition에서 작동할지 모르겠습니다 .


답변

  1. .jar의 이름을 .zip으로 변경
  2. 추출물
  3. jad로 클래스 파일 디 컴파일
  4. 재귀 적 차이

답변

나는 ZipDiff lib (Java와 ant API가 모두 있음)를 사용합니다.


답변

매개 변수 xvf와 함께 jar 명령을 사용하여 각 jar를 자체 디렉토리에 추출하십시오. 즉 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를 실행 한 다음 거기에서 스크립트를 실행하십시오.


답변

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