2012-01-24 23 views
8

Tôi đang xây dựng tệp jar java bằng kiến. Tôi cần bao gồm các jars bổ sung bằng cách sử dụng "zipfileset src =" xxx.jar "" zipfileset src = "yyy.jar" và cả xxx.jar và yyy.jar đều có các lớp với các tên lớp đủ điều kiện SAME. Vì vậy, tệp jar kết quả có tên lớp trùng lặp. Các tác động có thể có của việc sao chép là gì?Các tác động của việc có các lớp trùng lặp trong jar java là gì?

Cảm ơn bạn.

+0

tại sao bạn muốn làm điều đó ? – Bhushan

Trả lời

15

Nếu chúng là trùng lặp triển khai, không có gì – việc tải được là không quan trọng.

Nếu không, bạn đang ở lòng thương xót của thứ tự tải lớp và có thể nhận được phiên bản khác với bạn muốn.

chỉ định rằng mục nhập classpath sẽ được tìm kiếm theo thứ tự được liệt kê (theo this classpath doc). nhưng điều đó chỉ có liên quan nếu bạn hoàn toàn kiểm soát việc tạo classpath (chẳng hạn như trong ứng dụng web).

(Với sự báo trước rằng wildcarding classpath làm cho trật tự không xác định.)

+0

Có, có các bản triển khai trùng lặp chính xác, cảm ơn bạn. –

0

Tôi đồng ý với Dave.

Bạn có thể tách chúng bằng không gian tên để tránh những cạm bẫy mà anh đề xuất không?

4

Nói chung, tình huống này là rất không được khuyến nghị và cần tránh.

Lọ trong java chỉ là vùng chứa cho tệp lớp học của bạn. java sử dụng các trình nạp lớp để xem xét classpath và tải các tệp lớp từ đó. vì vậy nếu bạn có 2 jars A.jar và B.jar có cùng lớp x.y.Foo bên trong, lớp từ jar đến trước trong classpath sẽ được nạp. Vì vậy, nếu classpath của bạn là A.jar, B.jar (theo thứ tự này) lớp Foo từ A.jar sẽ được sử dụng trong thời gian chạy. Sự không nhất quán này có thể dẫn đến các lỗi rất khó khắc phục từ trải nghiệm của tôi

+0

Tôi hiểu. Tôi sẽ thay đổi kiến ​​xây dựng tập tin để bao gồm "dir" thuộc tính trong zipfileset thay vì "src". –

1

có nghĩa là sao chép? rõ ràng là bạn không thể có 2 lớp có cùng tên trong cùng một gói (thậm chí dự án của bạn sẽ không biên dịch), nhưng nếu bạn có nghĩa là bạn có 2 lớp có cùng tên trong các gói khác nhau là "là ok".

+0

Tôi có 2 lọ: xxx.jar và yyy.jar được sử dụng riêng. Họ đang chia sẻ một phần việc triển khai chính xác. Ngoài ra tôi đang xây dựng một cái lọ bao gồm 2 lọ. Vì vậy, nếu tôi mở jar kết quả thì tôi có thể thấy tên lớp trùng lặp trong cùng một gói. Câu hỏi –

+0

, cả hai lớp đều có cùng chức năng ?, bởi vì nếu đó là sự thật, bạn có thể chỉ trỏ đến một cái bình và tránh điều đó, ví dụ: yyy.jar (loại bỏ lớp và sử dụng xxx.jar {keep class}) – elopez

0

Một câu trả lời mà tôi không thấy thảo luận ở đây là nếu bạn có kế hoạch ký hợp đồng lọ của bạn, Hội này khai, gói ứng dụng sau đó nó signjar sẽ phàn nàn rằng bạn có mục trùng lặp

jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: com/foo/bar/baz.java 
Các vấn đề liên quan