2008-12-16 22 views

Trả lời

29

Đị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.

2

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.

3

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:

2

Đâ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ụ.

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