Tôi đang làm việc trên dự án nguồn mở. Tính đến bây giờ tôi không có bất kỳ tùy biến trong bất kỳ lớp học. Vì vậy, sử dụng tất cả các tệp tin jars được cung cấp bởi dự án mã nguồn mở. Câu hỏi của tôi là nếu tôi sửa đổi một tệp java, biên dịch nó và đóng gói tệp jar mới với cấu trúc thư mục giống nhau, sẽ có vấn đề gì khi khởi động máy chủ hoặc thời gian chạy không? Nếu không phải tập tin lớp nào sẽ được gọi (tệp mặc định hoặc tệp lớp java tùy chỉnh của tôi)?Tệp lớp java nào sẽ được gọi nếu cùng một lớp được đóng gói trong hai tệp jar?
Trả lời
Trong thực tế nó phụ thuộc vào nhiều yếu tố:
Nếu cả hai tập tin jar đang trong ClassLoader cùng, ví dụ classpath Java (
-cp
tùy chọn), thông thường nó sẽ là file đầu tiên được tìm thấy trong jar danh sách đơn đặt hàng.Nếu được triển khai trong vùng chứa JavaEE, như trong tệp EAR hoặc trong
WEB-INF/lib
hoặc tệp WAR, sẽ không có bảo hành nào chứa cùng lớp giữa hai lần khởi động. Trong bối cảnh đó, điều duy nhất chắc chắn làWEB-INF/classes
được tìm kiếm trước khiWEB-INF/lib
Trong một hệ thống phân cấp ClassLoader phức tạp, hành vi mặc định là tìm kiếm cha mẹ đầu tiên nhưng JavaEE triển khai đã giới thiệu các cơ chế như chính sách giữa phụ huynh và cuối cùng (WebSphere) hoặc lọc nhờ vào deployment descriptor (WebLogic)
Một lựa chọn có thể tuyên bố jar file dependencies trong META-INF/MANIFEST.MF
tập tin nhờ vào thuộc tính Class-Path
. Nó sẽ thực thi một thứ tự tải ở mức ClassLoader, đặc biệt khi bắt đầu với java -jar myapp.jar
nhưng nó có thể phụ thuộc vào việc triển khai trong ngữ cảnh JavaEE.
Lưu ý: khi sử dụng dự án OpenSource, có thể công bằng khi gửi yêu cầu thay đổi và xuất bản các thay đổi hoặc cải tiến của bạn để cộng đồng hưởng lợi từ nó. Sau đó dự án của bạn có thể cập nhật lên luồng chính mà không gặp khó khăn về các bản vá lỗi hoang dã trong ClassPath của bạn.
Như bạn đã nói Nếu cả hai tệp jar nằm trong cùng một ClassLoader, ví dụ như đường dẫn lớp Java (tùy chọn -cp), thông thường nó sẽ là tệp đầu tiên được tìm thấy trong thứ tự danh sách jar. Nhưng một lần nữa ở điểm thứ hai, bạn nói nếu nó là trường hợp với tập tin chiến tranh triển khai trong webcontainer như tomcat, mà lớp tập tin sẽ được gọi là không được bảo đảm. Đúng không? –
Một điểm nữa. Bạn đã nói Một tùy chọn có thể là khai báo phụ thuộc tệp jar trong tệp META-INF/MANIFEST.MF nhờ thuộc tính Class-Path. Nó sẽ thực thi một thứ tự tải ở mức ClassLoader nhưng nó có thể phụ thuộc vào việc triển khai thực hiện trong một ngữ cảnh JavaEE. Chỉ cần xác nhận rằng sự hiểu biết của tôi nếu lớp A được đóng gói trong hai tệp jar J1 và J2. Lớp A được gọi từ lớp B (được đóng gói trong J3) .Nếu chúng ta muốn Class A từ jar J2 được gọi, thì chúng ta cần đề cập đến điều này trong tệp menifest của jar J3. Chính xác? –
Có chính xác. Tệp kê khai J3 phải chứa Class-Path: j2.jar và tệp kê khai J2 phải chứa Class-Path: j1.jar. Vì vậy, nó thực thi thứ tự tải đầu tiên: j3, sau đó j2, sau đó j1. Đặc biệt hữu ích khi được đóng gói với thuộc tính Main-Class. –
Trình tải lớp đang tìm kiếm địa điểm đầu tiên cần có tài nguyên cần thiết. Điều đó có nghĩa là nếu lớp học có cùng tên và gói xuất hiện trong 2 lọ, cái đầu tiên được tìm thấy sẽ được sử dụng. Cái nào là cái đầu tiên? Theo classpath: nếu ví dụ hạng A xuất hiện trong lọ one.jar và two.jar và dòng lệnh của bạn là:
java -cp one.jar;two.jar
MyMain`
phiên bản từ one.jar sẽ được sử dụng. Nhưng nếu dòng lệnh là
java -cp two.jar;one.jar
MyMain`
lớp từ two.jar sẽ được khởi tạo.
Bạn có một tham chiếu nói rằng đây là * quy định/tài liệu * hành vi? Tôi [không nhìn thấy một] (http://stackoverflow.com/questions/9757279/how-jvm-works-when-two-same-jar-be-included-in-classpath/9757720#9757720). –
điều gì xảy ra khi nó là 'java -cp/src/lib/* MyMain' và thư mục lib chứa one.jar và two.jar? – enator
- 1. Chạy lớp trong tệp Jar
- 2. cách biết lớp/gói/phương thức nào được sử dụng bởi tệp jar đã cho?
- 3. Đóng gói mã android vào tệp jar
- 4. Cách tải tài nguyên từ tệp jar được đóng gói trong tệp chiến tranh?
- 5. Java - Tạo một Lớp từ một Tệp Jar
- 6. chạy exe được đóng gói bên trong jar
- 7. Có thể sử dụng hai lớp java có cùng tên và cùng một gói không?
- 8. Hai lớp học công khai trong một tệp java
- 9. Xuất dự án Java dưới dạng tệp .jar sẽ khiếu nại rằng một số tệp .java không được tìm thấy
- 10. Cách thêm các lớp Java mới vào các lớp hiện có trong tệp jar
- 11. Các lớp học cùng gói có thể trải rộng trên nhiều tệp Jar không?
- 12. Hai tệp java, trong cùng một thư mục, một tệp truy cập vào các lớp khác/s?
- 13. Điều gì sẽ xảy ra nếu hai tập lệnh python muốn viết trong cùng một tệp?
- 14. Đóng gói nhiều rpms trong một tệp
- 15. Nhiều Lớp Enum trong một Tệp Java
- 16. Eclipse, JAR Export là các tệp svn đóng gói
- 17. Danh sách các lớp học trong một tệp jar
- 18. Nếu lớp dẫn xuất không ghi đè lên phương thức, phiên bản nào sẽ được gọi?
- 19. Mở rộng một lớp java từ một tệp trong một tệp java khác
- 20. cách thêm một lớp java vào một thư mục trong một tệp jar
- 21. Khi nào tệp JVM giải nén tệp jar của Java?
- 22. Cách đóng gói tài nguyên trong Jar đúng
- 23. maven exec: java chạy tập tin lớp trong jar
- 24. Cách mở tệp được đóng gói với WinRT
- 25. Lớp đóng gói chặt chẽ
- 26. Cách sử dụng các lớp từ tệp .jar?
- 27. Lớp Ứng dụng Android được gọi hai lần
- 28. Java Applet trong Tệp JAR
- 29. Lấy tên của tất cả các lớp Java được khai báo trong một gói
- 30. Sẽ đóng gói phá vỡ kế thừa?
Tôi tin rằng JVM sẽ sử dụng lớp này từ tệp jar đầu tiên mà nó có thể tìm thấy trong đường dẫn lớp. Và một câu hỏi tương tự đã được trả lời ngày hôm nay chính nó "Cách JVM hoạt động khi hai cùng một jar được bao gồm trong classpath" – sachinrahulsourav
có thể trùng lặp của [Làm thế nào JVM hoạt động khi hai cùng một jar được bao gồm trong classpath] (http://stackoverflow.com/ câu hỏi/9757279/how-jvm-works-khi-hai-cùng-jar-be-bao gồm-trong-classpath) –