2010-03-30 12 views
15

Google sử dụng bsdiffCourgette để vá các tệp nhị phân như phân phối Chrome. Có bất kỳ công cụ tương tự nào tồn tại để vá các tệp jar không?Có gì giống như bsdiff/Courgette cho các tệp jar không?

Tôi đang cập nhật tệp jar từ xa qua kết nối giới hạn băng thông và muốn giảm thiểu lượng dữ liệu được gửi. Tôi có một số quyền kiểm soát máy khách ở một mức độ nào đó (tức là tôi có thể chạy tập lệnh cục bộ) và tôi đảm bảo rằng ứng dụng đích sẽ không chạy vào thời điểm đó.

Tôi biết rằng tôi có thể vá các ứng dụng java bằng cách đặt các tệp lớp được cập nhật vào đường dẫn lớp, nhưng tôi muốn có một phương pháp rõ ràng hơn để thực hiện cập nhật. Nó sẽ là tốt nếu tôi có thể bắt đầu với tệp jar mục tiêu, áp dụng một bản vá nhị phân, và sau đó gió lên với một tệp jar được cập nhật giống hệt nhau (bitwise) vào bình mới (từ đó bản vá được tạo).

+0

lợi thế gì bạn đang tìm kiếm trên chỉ đơn giản là xử lý các jar như một tập tin nhị phân và vá nó? –

+2

Nén lớn hơn. Bsdiff và Courgette đạt được tỷ lệ nén cao hơn vì các thuật toán mà chúng sử dụng được thiết kế đặc biệt để nén các tệp thực thi lớn. Tôi không biết, nhưng có vẻ như với tôi giống như những thứ tương tự có thể được thực hiện cho các tập tin jar. –

+1

Câu hỏi liên quan: http://stackoverflow.com/questions/3738523/patching-java-software –

Trả lời

2

Thử dự án javaxdelta trên Sourceforge. Nó sẽ cho phép tạo bản vá và áp dụng chúng.

[EDIT] Công cụ này chưa tồn tại. Mở tệp JAR bằng các công cụ thông thường và sau đó sử dụng javaxdelta để tạo một bản vá cho mỗi mục nhập trong JAR. ZIP chúng lên và sao chép chúng vào máy chủ.

Ở phía bên kia, bạn cần phải cài đặt một tệp JAR nhỏ có thể thực hiện để lấy bản vá và tệp JAR làm đối số và áp dụng bản vá. Bạn cũng sẽ phải viết cái này, nhưng điều đó không nên mất nhiều hơn vài giờ.

+0

Hi Aaron - Tôi không tìm kiếm một thuật toán vá nhị phân được thực hiện trong java, tôi đang tìm một công cụ vá được thiết kế riêng để làm việc cụ thể với các tệp JAR, dọc theo các dòng của pack200. –

+0

Công cụ này chưa tồn tại. Mở tệp JAR bằng các công cụ thông thường và sau đó sử dụng javaxdelta để tạo một bản vá cho mỗi mục nhập trong JAR. ZIP chúng lên và sao chép chúng vào máy chủ. Ở phía bên kia, bạn cần phải cài đặt một JAR thực thi nhỏ, có bản vá và tệp JAR làm đối số và áp dụng bản vá. Bạn cũng sẽ phải viết cái này, nhưng điều đó không nên mất nhiều hơn vài giờ. –

+0

@Ken - Điều Aaron đề xuất không phải là một thuật toán thực sự, nhưng là những gì bạn sẽ muốn làm. Tệp Jar là các tệp zip có tệp lớp trong đó. Một sự khác biệt nhị phân của lớp cũ/foo.class và new/foo.class có thể được tiết lộ một vài sự khác biệt, trong khi một sự khác biệt nhị phân của old/foo.jar và new/foo.jar có khả năng trông khác nhau hơn. Bạn có thể dễ dàng chỉ nén (zip) sự khác biệt nhị phân của các tệp lớp và gửi cho các điểm cuối của bạn. Sau đó, tại mỗi điểm kết thúc, họ sẽ giải nén từng tệp jar của họ cần được vá, áp dụng bản vá và sau đó nén chúng lại. – nategoose

1

tệp .jar đã được nén, vì vậy những gì bạn thực sự yêu cầu là nén hoạt động tốt trên các tệp zip;). Nếu bạn nhận được nó trước khi bạn công cụ trong jar bạn có tỷ lệ cược tốt hơn lợi dụng kiến ​​thức rằng nó là "java" tôi mong đợi. Tôi nghi ngờ bạn có thể thích ứng với các yếu tố được mô tả trong paper này như là một phương pháp nén java cụ thể.

+0

pack200 đã đề cập đến vấn đề nén; những gì tôi đang tìm kiếm là cái gì đó đề cập đến việc vá lỗi. http: //java.sun.com/j2se/1.5.0/docs/guide/deployment/deployment-guide/pack200.html –

1

Vấn đề là những thay đổi rất nhỏ trong nguồn có thể có những thay đổi rất lớn trong tệp .JAR được nén.

Đây là một tạo tác loại bỏ sự thừa. Vì vậy, không có vấn đề như thế nào tốt công cụ khác biệt của bạn là, nó có một nhiệm vụ gần như không thể trên tay của nó.

Tuy nhiên - có giải pháp để tạo các khác biệt và áp dụng các bản vá cho dữ liệu không nén. Ví dụ:

Giả sử bạn có

dự án v1.jar

dự án v2.jar

Tạo sự khác biệt giữa hai tập tin này có thể sẽ rất lớn, mặc dù sự thay đổi nội có thể rất nhỏ. Vì vậy, nói rằng chúng ta có một chương trình 'rejar' 'unjar' và - chúng ta có thể tạo ra

dự án v1.jar -> dự án v1.jar.unjar

dự án v2.jar -> dự án-v2. jar.unjar

Sau đó, thực hiện sự khác biệt giữa các tệp 'chưa xác định' để tạo bản vá. Để áp dụng bản vá sẽ là

project-v1.jar (unjar) -> project-v1.jar.unjar - (áp dụng bản vá) -> project-v1.patched.unjar (rejar) -> project-v1. vá.jar

Có hiệu quả, chương trình 'chưa mở' (và 'rejar' ngược lại) sẽ lấy tệp ZIP nguồn (hoặc bất kỳ loại tệp nào khác) và giải nén nội dung - bao gồm tiêu đề, thuộc tính và bất kỳ chi tiết nào khác cho luồng đầu ra (thay vì tạo các tệp riêng lẻ).

Đây không phải là một bộ lọc rất phức tạp để viết. Tiền thưởng được thêm vào sẽ làm cho nó nhận biết và đệ quy về nén (vì vậy bạn có thể áp dụng nó vào một tệp tin WAR).

+0

Vấn đề là mã nguồn (các tệp .JAVA chưa mở) lớn hơn mã được biên dịch trong tệp .JAR. Vì vậy, sự khác biệt giữa tệp .JAVA có thể có kích thước lớn hơn so với sự khác biệt giữa tệp .JAR hoặc .DEX. –

+0

.unjar không ngụ ý sourcecode, nó ngụ ý một (lưu trữ không nén) của các tệp .class - I.E: jar với tùy chọn 0 (không nén). Bạn cũng sẽ nén khác biệt của bạn! – user340535

0

séc delta-updater

nó là xây dựng cho diff nhị phân và các thư mục vá, bạn có thể sử dụng IOFilter để lọc các file bao gồm