답변:
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 Edition에서 작동할지 모르겠습니다 .
jar
대신 파일의 이름을 변경하고 사용하는, 압축을 풉니 다 pkunzip
.)
javap -c
하여 바이트 코드로 유지합니다 (특히 "메서드 변경"에 의해 OP가 메서드 서명 변경을 의미하는 경우).
diff
ing javap
또는 jad
출력을 엉망으로 던질 것이라고 생각합니다 .
매개 변수 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를 실행 한 다음 거기에서 스크립트를 실행하십시오.
diff -r ${EXT_DIR1} ${EXT_DIR2}
또는 ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(선언 된 변수를 재사용하는 경우). cygwin을 사용하는 사람들에게는 내가 변경 한 두 가지 사항을 제외하고 스크립트가 거의 작동했습니다. 1) jad를 다운로드 할 수 없기 때문에 jad 대신 내장 javap를 사용해야했습니다 (엔터 프 방화벽 ... ); 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
? PATH에서 바이너리 사용할 수 있습니다하지 마십시오
foo/bar/toto.jar
-p
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 를 사용하여 비교를 수행합니다.
소스 코드의 저작권 보유자에게 문의하여 그렇게해도되는지 확인해야합니다.
자바 디 컴파일러를 사용 하고 모든 .class 파일을 디 컴파일 하고 모든 파일을 프로젝트 구조로 저장합니다.
그런 다음 meld diff 뷰어를 사용하고 폴더로 비교합니다.
다음은 명백히 무료 인 도구입니다. http://www.extradata.com/products/jarc/
http://www.osjava.org/jardiff/를 시도 하십시오 -도구가 오래되었고 종속성 목록이 큽니다. 문서에서 시도해 볼 가치가있는 것 같습니다.