So sánh hai tệp .jar


93

Làm cách nào để so sánh hai tệp .jar? Cả hai đều đã biên dịch các tệp .class.

Tôi muốn sự khác biệt về thay đổi phương pháp, v.v.

Câu trả lời:


95

Andrey, sự khác biệt giữa những công cụ đó là gì? Chúng có xuất phát từ cùng một lõi không?
Nikolay Kuznetsov

3
@NikolayKuznetsov, không, những công cụ này có cốt lõi khác nhau. pkgdiff - so sánh trực quan các khai báo của lớp, trình kiểm tra tuân thủ japi và clirr - phân tích các thay đổi (cái đầu tiên được viết bằng perl, cái thứ hai - bằng java).
linuxbuild

Bạn đã thử tích hợp cái gì đó với TeamCity chưa? Có vẻ như clirr có Plugin Maven và cũng có một công cụ gọi là JAPI-Checker.
Nikolay Kuznetsov

3
Xin lưu ý rằng cả Japi-Compliance-Checker và Pkgdiff không so sánh mọi thứ. Ví dụ, tất cả các triển khai phương thức đều bị bỏ qua. Chỉ các chữ ký phương thức, xóa phương thức và khả năng tương thích API được tạo dưới dạng báo cáo. Nếu bạn muốn so sánh các tệp nhị phân thì bạn có thể chọn sử dụng các công cụ như diff hoặc cmp hoặc plugin IntelliJ hoặc thậm chí Beyond Compare!
Sriram

22

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 .


1
@ChristianNilsson, hoạt động vào năm 2018.2 trên Mac 10.14 Mojave
xuesheng 22/1018

Tôi đã sai lầm khi chọn trình bao bọc Maven. Trong Thư viện bên ngoài, người ta cần mở rộng trình bao bọc và sau đó chọn tệp jar. Cảm ơn @xuesheng
Christian Nilsson

Giải pháp siêu dễ dàng.
xandermonkey

Thật tuyệt vời, đó là những gì tôi đang tìm kiếm :)
z1lV3r

18
  1. Đổi tên .jar thành .zip
  2. Trích xuất
  3. Giải mã các tệp lớp với jad
  4. Khác biệt đệ quy

2
Đó là vũ phu, nhưng đó chính xác là cách tôi muốn làm. (Ngoại trừ việc tôi có thể sử dụng jarđể trích xuất nội dung, thay vì đổi tên các tập tin và sử dụng pkunzip.)
David R Tribble

2
Tùy ý thay thế bước 3 bằng một lời gọi để 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).
Mark Peters

Bạn sẽ xử lý như thế nào khi các phần thân phương thức được di chuyển lên hoặc xuống tệp nguồn? Tôi nghĩ rằng sẽ ném diffing của javaphoặc jadsản lượng ra khỏi Whack.
Marcus Junius Brutus


5

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 ý.


2

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

2

Đâ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ừ đó.


2
Có vẻ như bạn đã bỏ lỡ dòng cuối cùng: 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"
PetroCliff

Bạn đúng @dpg. Dòng cuối cùng là $ {DIFF} $ {EXT_DIR1} $ {EXT_DIR2}
skanga

jadgì? Không có tệp nhị phân đó trong PATH
Filip

Jad là một trình biên dịch Java. Tôi nghĩ rằng nó không còn được duy trì nữa nhưng tôi thấy nó có sẵn tại javadecompilers.com/jad
skanga

Trong trường hợp lập luận của bạn (file jar) đang ở trong một thư mục con (như foo/bar/toto.jar), bạn cần phải thêm -ptham số cho lệnh mkdir
Duduche

1

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.


1

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 ..


0

Đây là một công cụ rõ ràng miễn phí http://www.extradata.com/products/jarc/


Cảm ơn. Tôi đã thử cái này. Nó tạo ra trong XML và tiếp tục xử lý là cần thiết để làm cho nó có thể đọc được, nếu bạn có nhiều lớp trong .jar
Kunal

1
Đối với tôi, nó phàn nàn về một công cụ bị thiếu. Tôi sử dụng JDK, vì vậy đó không phải là vấn đề. Tôi nghĩ rằng nó không hỗ trợ java7.
Roel Spilker

@Tom liên kết bị hỏng, câu trả lời này có thể bị xóa.
David Dossot

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.