Địa ngục classpath là gì và/nó có thực sự là một vấn đề đối với Java không?Địa ngục classpath là gì và liệu nó có thực sự là một vấn đề đối với Java không?
Trả lời
Địa ngục đường dẫn là kết quả không may của liên kết động của loại được thực hiện bởi Java.
Chương trình của bạn không phải là một thực thể cố định mà là tập hợp các lớp chính xác được tải bởi một JVM trong một cá thể cụ thể. Rất có thể trong các tình huống mà cùng một dòng lệnh trên các nền tảng khác nhau hoặc thậm chí trên cùng một nền tảng sẽ dẫn đến kết quả hoàn toàn khác nhau do các quy tắc về độ phân giải.
Có thể có sự khác biệt trong thư viện chuẩn (rất phổ biến). Thư viện có thể được ẩn bởi nhau (một phiên bản cũ hơn thậm chí có thể được sử dụng thay vì một phiên bản mới hơn). Cấu trúc thư mục có thể có độ phân giải lộn xộn. Một phiên bản khác của cùng một lớp có thể xuất hiện trong nhiều thư viện và lớp đầu tiên gặp phải sẽ được sử dụng, v.v. Vì Java, theo đặc tả, sử dụng chính sách đầu tiên, các phụ thuộc sắp xếp không xác định có thể dẫn đến các vấn đề. Tất nhiên, vì đây là dòng lệnh và nó là một phần của spec, không có cảnh báo thực sự.
Nó vẫn còn là một vấn đề. Ví dụ trên Mac OS sự hỗ trợ khủng khiếp từ Apple có nghĩa là máy của bạn kết thúc với một số JVM và một số JRE, và bạn không bao giờ có thể dễ dàng poart mọi thứ từ nơi này đến nơi khác. Nếu bạn có nhiều thư viện được biên soạn với các phiên bản khác nhau nhưng khác nhau của các thư viện khác, bạn coulld có vấn đề, v.v.
Tuy nhiên, vấn đề này không phải là vốn có trong Java. Tôi nhớ chia sẻ của tôi về tình huống DLL địa ngục trong khi các cửa sổ lập trình trong những năm 90. Bất kỳ tình huống nào mà bạn phải dựa vào thứ gì đó trong hệ thống tệp để tập hợp chương trình của bạn thay vì có một tệp thực thi được xác định rõ ràng là một vấn đề.
Tuy nhiên, lợi ích của mô hình này vẫn tuyệt vời, vì vậy tôi sẵn sàng chịu đựng địa ngục này. Ngoài ra còn có các bước đi đúng hướng trên mặt trời. Ví dụ, Java6 cho phép bạn chỉ cần chỉ định một thư mục với các lọ hơn là phải liệt kê chúng.
BTW: Classpath cũng là một vấn đề nếu bạn đang sử dụng môi trường sử dụng trình nạp lớp không mặc định. Ví dụ, tôi đã có rất nhiều vấn đề khi chạy những thứ như Hibernate hoặc Digester trong Eclipse vì các trình nạp lớp không tương thích.
Có rất nhiều thứ tốt ở đây http://mindprod.com/jgloss/classpath.html và http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
Tôi chỉ có vấn đề với classpaths khi tôi không thiết lập được bản thân mình sử dụng -cp. Cố gắng tìm ra cách phần mềm bên thứ ba của bạn thiết lập classpath của họ có thể là một nỗi đau ở lần.
Tôi nghĩ rằng "classpath hell" là thời gian khi classpath của một ứng dụng Java chỉ có thể được thiết lập bằng cách sử dụng biến môi trường CLASSPATH. Điều này dẫn đến nhiều ứng dụng yêu cầu thay đổi cấu hình hệ thống toàn cầu (khác nhau đối với mỗi hệ điều hành), xung đột giữa các ứng dụng và sự nhầm lẫn chung.
Classpath/jar-địa ngục có một vài hầm thoát nếu họ có ý nghĩa cho dự án của bạn:
- OSGi
- JarJarLinks
- NetBeans Module System - Không chắc chắn nếu điều này nằm ngoài sử dụng của NetBeans
- Khác?
Đây là một ví dụ khá cụ thể hơn:
Khi hai thư viện (hoặc một thư viện và ứng dụng) đòi hỏi phiên bản khác nhau của cùng một thư viện thứ ba. Nếu cả hai phiên bản của thư viện thứ ba sử dụng cùng một tên lớp , không có cách nào để tải cả hai phiên bản của thư viện thứ ba với cùng trình nạp lớp.
Lấy loot theo số http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell để biết thêm ví dụ.
- 1. System.Globalization là gì và sự khác biệt giữa nó và nội địa hóa là những gì
- 2. Một Enterprise Java Bean thực sự là gì?
- 3. Mới đối với Java - JPA và DAO là gì?
- 4. Vấn đề với ODBC là công nghệ là gì?
- 5. PCDATA và CDATA thực sự là gì?
- 6. ORM có phải là vấn đề cụ thể đối với lập trình hướng đối tượng không?
- 7. Combineaccessrules có nghĩa là gì trong các classpath Eclipse?
- 8. Địa chỉ WCF Địa ngục?
- 9. Điểm của jQuery ajax là gì? Nó có thực sự làm gì không?
- 10. lệnh adb địa ngục (không phải là một lỗi đánh máy)
- 11. Điều gì thực sự là một @selector?
- 12. Sự khác nhau giữa Java 6 và 7 có thể gây ra vấn đề về hiệu suất là gì?
- 13. Từ khóa 'yield' có phải là một cú pháp không? Thực hiện của nó là gì
- 14. Điều này thực sự là gì trong Java?
- 15. Vấn đề với khóa ngoại tuyến là nhiều đường dẫn và chu kỳ là gì?
- 16. DTO và BO là gì? Sự khác biệt là gì?
- 17. Ký tự đại diện kiểu Java của Java thực sự có ý nghĩa gì? Sự khác biệt thực sự giữa Foo và Foo <?> là gì?
- 18. Tối ưu hóa! - Nó là gì? Làm thế nào là nó được thực hiện?
- 19. Làm thế nào để tránh địa ngục dữ liệu/sự kiện trên màn hình phức tạp?
- 20. Tôi tiếp tục nghe về địa ngục DLL - đây là gì?
- 21. Windbg: SOS.dll:! Gcroot: DOMAIN (xxx): HANDLE (Pinned): Liệu nó thực sự có nghĩa là đối tượng được ghim?
- 22. AngularJS có thực sự là MVC không?
- 23. Đối tượng hạng nhất trong Java và C# là gì?
- 24. Sự khác biệt giữa '&' và ',' trong Generics Java là gì?
- 25. Vấn đề quyền của MySQL - không phải là vấn đề
- 26. vấn đề Classpath sử dụng XPathFactory
- 27. Generics <?> thực sự có nghĩa là gì?
- 28. vấn đề với classpath cầu nối khi làm việc với gwt và jsp
- 29. JAF là gì? Mục đích của nó là gì?
- 30. Điều gì đã từng xảy ra với deltree và sự thay thế của nó là gì?
tôi nghĩ rằng đó là http://en.wikipedia.org/wiki/Classloader#JAR_hell –