Câu trả lời:
JAPICC , sử dụng mẫu:
japi-compliance-checker OLD.jar NEW.jar
Báo cáo mẫu cho log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , sử dụng mẫu:
pkgdiff OLD.jar NEW.jar
Xem báo cáo mẫu cho args4j.
Clirr , sử dụng mẫu:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Nếu bạn chọn hai tệp trong IntellijIdea và nhấn Ctrl + D
thì nó sẽ hiển thị cho bạn sự khác biệt. Tôi sử dụng Ultimate và không biết liệu nó có hoạt động với phiên bản Cộng đồng hay không .
jar
để trích xuất nội dung, thay vì đổi tên các tập tin và sử dụng pkunzip
.)
javap -c
giữ nó ở dạng bytecode (đặc biệt nếu bằng "phương thức thay đổi", OP có nghĩa là thay đổi chữ ký của phương thức).
diff
ing của javap
hoặc jad
sản lượng ra khỏi Whack.
Giải nén mỗi jar vào thư mục riêng của nó bằng cách sử dụng lệnh jar với tham số xvf. I Ejar xvf myjar.jar
cho mỗi lọ.
Sau đó, sử dụng lệnh UNIX diff
để so sánh hai thư mục. Điều này sẽ cho thấy sự khác biệt trong các thư mục. Bạn có thể sử dụng diff -r dir1 dir2
hai đệ quy và hiển thị sự khác biệt trong các tệp văn bản trong mỗi thư mục (.xml, .properties, v.v.).
Điều này cũng sẽ hiển thị nếu các tệp lớp nhị phân khác nhau. Để thực sự so sánh các tệp lớp, bạn sẽ phải dịch ngược chúng như những người khác đã lưu ý.
Trong Linux / CygWin, một tập lệnh hữu ích mà tôi sử dụng đôi khi là:
#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
Đây là tập lệnh của tôi để thực hiện quá trình được mô tả bởi 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}
Tôi có thể chạy nó trên Windows bằng GIT cho Windows. Chỉ cần mở một dấu nhắc lệnh. Chạy bash và sau đó thực thi tập lệnh từ đó.
diff -r ${EXT_DIR1} ${EXT_DIR2}
hoặc ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(nếu sử dụng lại biến đã khai báo của bạn). Đối với những người đang sử dụng cygwin, tập lệnh gần như phù hợp với tôi ngoại trừ hai điều mà tôi đã thay đổi: 1) Tôi phải sử dụng javap tích hợp sẵn thay vì jad, vì tôi không thể tải xuống jad (enterp. Firewall ... ); 2) như không jar xf
hiểu các con đường như/cygwin/c/rest/of/path
được trả về bởi pwd
trong Cygwin, tôi đã phải chuyển nó sang c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
gì? Không có tệp nhị phân đó trong PATH
foo/bar/toto.jar
), bạn cần phải thêm -p
tham số cho lệnh mkdir
Sử dụng Java Decompiler để biến tệp jar thành tệp mã nguồn, sau đó sử dụng WinMerge để thực hiện so sánh.
Bạn nên tham khảo ý kiến của người giữ bản quyền của mã nguồn, để xem liệu làm như vậy có được không.
sử dụng trình dịch ngược java và dịch ngược tất cả các tệp .class và lưu tất cả các tệp dưới dạng cấu trúc dự án.
sau đó sử dụng trình xem khác biệt meld và so sánh dưới dạng thư mục ..
Đây là một công cụ rõ ràng miễn phí http://www.extradata.com/products/jarc/
Vui lòng thử http://www.osjava.org/jardiff/ - công cụ đã cũ và danh sách phụ thuộc rất lớn. Từ các tài liệu, có vẻ như đáng để thử.