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 + Dthì 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 -cgiữ 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).
diffing của javaphoặc jadsả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 dir2hai đệ 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 xfhiểu các con đường như/cygwin/c/rest/of/path được trả về bởi pwdtrong 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"
jadgì? Không có tệp nhị phân đó trong PATH
foo/bar/toto.jar), bạn cần phải thêm -ptham 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ử.