두 .jar 파일 비교


93

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

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

답변:


95

안드레이, 그 도구들의 차이점은 무엇입니까? 동일한 핵심에서 유래합니까?
Nikolay Kuznetsov

3
@NikolayKuznetsov, 아니요, 이러한 도구에는 다른 코어가 있습니다. pkgdiff-클래스 선언의 시각적 비교, japi-compliance-checker 및 clirr-변경 분석 (첫 번째는 perl로 작성되고 두 번째는 Java로 작성 됨)
linuxbuild

TeamCity와 통합 해 보셨습니까? clirr에는 Maven 플러그인이 있으며 JAPI-Checker라는 도구도 있습니다.
Nikolay Kuznetsov

3
Japi-Compliance-Checker와 Pkgdiff는 모두 모든 것을 비교하지는 않습니다. 예를 들어 모든 메서드 구현이 무시됩니다. 메서드 서명, 메서드 제거 및 API 호환성 만 보고서로 생성됩니다. 바이너리를 비교하려는 경우 diff 또는 cmp 또는 IntelliJ 플러그인 또는 Beyond Compare와 같은 도구를 사용할 수 있습니다!
Sriram

22

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


1
@ChristianNilsson는 맥 10.14에 2018.2 작동 모하비하지만
xuesheng

Maven 래퍼를 선택하는 실수를 저질렀습니다. 아래에서 외부 라이브러리 래퍼를 확장 한 다음 항아리 파일을 선택 하나가 필요합니다. 감사 @xuesheng
기독교 닐슨

매우 쉬운 솔루션.
xandermonkey

내가 찾던 것이 놀랍습니다. :)
z1lV3r

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

2
무자비한 힘이지만 그게 제가했던 방식입니다. (내가 사용할 수있는 것을 제외하고 jar대신 파일의 이름을 변경하고 사용하는, 압축을 풉니 다 pkunzip.)
데이비드 R 트리블에게

2
선택적으로 3 단계를에 대한 호출로 대체 javap -c하여 바이트 코드로 유지합니다 (특히 "메서드 변경"에 의해 OP가 메서드 서명 변경을 의미하는 경우).
Mark Peters

소스 파일의 위 또는 아래로 이동되는 메소드 본문을 어떻게 처리 하시겠습니까? 나는 그것이 diffing javap또는 jad출력을 엉망으로 던질 것이라고 생각합니다 .
Marcus Junius Brutus 2013


5

매개 변수 xvf와 함께 jar 명령을 사용하여 각 jar를 자체 디렉토리에 추출하십시오. 즉 jar xvf myjar.jar, 각 항아리에 대해.

그런 다음 UNIX 명령 diff을 사용하여 두 디렉터리를 비교합니다. 이것은 디렉토리의 차이점을 보여줍니다. diff -r dir1 dir2두 개의 재귀 를 사용 하여 각 디렉토리 (.xml, .properties 등)에서 텍스트 파일의 차이점을 표시 할 수 있습니다 .

이진 클래스 파일이 다른 경우에도 표시됩니다. 실제로 클래스 파일을 비교하려면 다른 사람이 언급 한대로 디 컴파일해야합니다.


3

다음은 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를 실행 한 다음 거기에서 스크립트를 실행하십시오.


2
마지막 줄을 놓친 것 같습니다 : diff -r ${EXT_DIR1} ${EXT_DIR2}또는 ${DIFF} ${EXT_DIR1} ${EXT_DIR2}(선언 된 변수를 재사용하는 경우). cygwin을 사용하는 사람들에게는 내가 변경 한 두 가지 사항을 제외하고 스크립트가 거의 작동했습니다. 1) jad를 다운로드 할 수 없기 때문에 jad 대신 내장 javap를 사용해야했습니다 (엔터 프 방화벽 ... ); 2)로 jar xfdoes't이 같은 경로를 이해 /cygwin/c/rest/of/path하는 반환 pwdCygwin에서, 나는로 변환했다 c:/rest/of/path: JAR_DIR=${PWD}, JAR_DIR=${JAR_DIR#*/cygdrive/c},JAR_DIR="c:$JAR_DIR"
PetroCliff

@dpg가 맞습니다. 마지막 줄은 $ {DIFF} $ {EXT_DIR1} $ {EXT_DIR2}이었다
skanga

무엇입니까 jad? PATH에서 바이너리 사용할 수 있습니다하지 마십시오
필립

Jad는 Java Decompiler입니다. 나는 더 이상 유지되지 않습니다 생각하지만 난에서이를 사용할 발견 javadecompilers.com/jad
skanga

인수 (jar 파일)가 하위 디렉토리 (예 foo/bar/toto.jar-p
:)

2

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

Java Decompiler 를 사용 하여 jar 파일을 소스 코드 파일로 변환 한 다음 WinMerge 를 사용하여 비교를 수행합니다.

소스 코드의 저작권 보유자에게 문의하여 그렇게해도되는지 확인해야합니다.



0

다음은 명백히 무료 인 도구입니다. http://www.extradata.com/products/jarc/


감사. 나는 이것을 시도했다. XML로 출력을 생성하며 .jar에 많은 클래스가있는 경우 읽을 수 있도록 추가 처리가 필요합니다.
Kunal

1
나에게 그것은 누락 된 tools.jar에 대해 불평했습니다. 저는 JDK를 사용하므로 문제가되지 않습니다. 나는 그것이 java7을 지원하지 않는다고 생각합니다.
Roel Spilker 2013

@Tom 링크가 끊어졌습니다.이 답변은 제거 될 수 있습니다.
David Dossot 2016 년

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.