2009-04-26 26 views
6

Tôi đang cố gắng để cập nhật một tập tin trong một jar hiện (trong ví dụ ANTLR này) bằng cách sử dụng lệnh:tập tin cập nhật trong một cái lọ ném ZipException

jar -uf antlrworks-1.2.3.jar org/antlr/codegen/templates/Java/Java.stg 

Nhưng tôi nhận được thông báo sau

java.util.zip.ZipException: mục trùng lặp: antlr/ANTLRError.class tại java.util.zip.ZipOutputStream.putNextEntry (ZipOutputStream.java:175) tại java.util.jar.JarOutputStream.putNextEntry (JarOutputStream.java : 92) tại sun.tools.jar.Main.update (Main.java:508) tại sun.tools.jar.Main.run (Main.java:185) tại sun.tools.jar.Main.main (Main.java:1044)

Bất kỳ ý tưởng?

Trả lời

8

Bạn đang cố gắng làm điều đúng, nhưng tệp jar có vấn đề - nó có cùng mục nhập hai lần: (Điều này là hợp pháp đối với tệp zip, nhưng không thực sự hữu ích - và như bạn thấy, nó làm jar phàn nàn.)

Nếu bạn chạy

jar tvf antlrworks-1.2.3.jar > contents 

và sau đó nhìn vào tạo contents tập tin bạn sẽ thấy rằng có những file trùng lặp khác nhau. bạn có lẽ nên báo cáo này cho dự án ANTLR (sau khi kiểm tra họ chưa biết)

Để giải quyết sự cố này, bạn có thể trích xuất nội dung của tệp jar, tạm dừng lại và sau đó bạn sẽ có tệp jar "đang hoạt động" mà bạn có thể cập nhật. (Nếu bạn chỉ cần thực hiện thao tác này một lần, bạn có thể chỉ cần trích xuất, đặt tệp bạn muốn vào đó, sau đó gộp toàn bộ lên thay vì cập nhật nó sau đó.)

1

Bạn có thể thực hiện thao tác tương tự với Ant jar task .

<jar duplicate="preserve" jarfile="..."> 
    your files 
</jar> 

thuộc tính trùng lặp với giá trị bảo tồn sẽ xử lý các mục trùng lặp.

As mentioned here, thuộc tính cập nhật với giá trị “bảo tồn” không cho bạn biết rằng bản sao tồn tại, ở dạng này:

aPath/aFile already added, skipping 

Nếu tập tin của bạn nằm trên đầu danh sách các nhiệm vụ bình có chọn tp xây dựng chính nó, tập tin mới của bạn sẽ được đưa vào tài khoản.

0

Nếu bạn đang sử dụng OS X, hãy thử ứng dụng Jar Inspector. Tôi đã sử dụng nó để vá lỗi javascript trong wicket. Bạn có thể mở tệp jar và liệt kê tất cả nội dung. Điều hướng đến tệp bạn muốn lưu (trong trường hợp này là tệp .js) và sửa đổi tệp, sau đó lưu nội dung và nó sẽ xử lý việc sửa đổi tệp .jar cho bạn. Bạn không chắc chắn nếu điều này sẽ làm việc với các tập tin .java hay không.

Các vấn đề liên quan