2012-03-06 30 views
9

Khi cố gắng giải quyết this problem, tôi đã gặp phải một số bài viết, v.v. đề cập đến Trình nạp lớp "bị cô lập". Tôi không thể tìm thấy định nghĩa cho trình nạp lớp riêng lẻ qua tìm kiếm của Google, vì vậy có thể thuật ngữ này không phải là thuật ngữ được biết đến rộng rãi và có lẽ có ý nghĩa khác trong các ngữ cảnh khác nhau.Trình nạp lớp riêng biệt trong Java là gì?

Dù sao, plugin chắc chắn hơn của Maven có thể sử dụng một ClassLoader bị cô lập: http://maven.apache.org/plugins/maven-surefire-plugin/examples/class-loading.html

Ngoài ra một trong những câu trả lời dưới đây tham khảo an article explaining how to create an "isolated" ClassLoader.

Không có tham chiếu nào ở trên đưa ra định nghĩa cho một Trình nạp lớp đơn lẻ; họ dường như cho rằng người đọc biết điều đó có nghĩa là gì hoặc có thể tra cứu nó. Tuy nhiên, liên kết thứ hai không bao gồm gợi ý về ý nghĩa của từ "bị cô lập":

Việc khởi động cho phép bạn chạy vùng chứa mà không làm ô nhiễm đường dẫn lớp hệ thống. Điều này cho phép bạn chạy các ứng dụng được triển khai của bạn với đường dẫn lớp hệ thống không được phân lớp làm cha mẹ của nó. Bạn đã đạt được cách ly trình nạp lớp.

Nhưng tôi không hoàn toàn rõ ràng về những gì được phân lập từ phần nào và cách đoạn này hoặc phần còn lại của bài viết. Tôi thấy rằng anh ấy đang tải một phiên bản của một lớp học/ghi đè/ghi đè lên một phiên bản khác - có thể một trình nạp lớp được phân lập từ một phiên bản khác bằng các trường hợp khác nhau w/o một là cha của người kia? Tôi không chắc.

Tôi đặc biệt thích một liên kết tìm kiếm của Google hoặc SO có chứa liên kết rõ ràng đang giữ câu trả lời. Một liên kết trực tiếp đến một câu trả lời cũng hoạt động. :)

+0

Vui lòng cung cấp liên kết hoặc báo giá cung cấp ngữ cảnh cho câu hỏi của bạn. (BTW, không covetousness một tội lỗi? :-)) –

+0

@Stephen: Chúng tôi sẽ đánh giá cao nếu bạn rời khỏi zealotry tôn giáo của bạn bên ngoài khi bạn đi vào. –

+2

Vâng, chúng ta biết từ Larry Wall rằng ba nhân đức vĩ đại của một lập trình viên là lười biếng, thiếu kiên nhẫn, và trung tâm, và vì sự ham muốn không phải là đức tính, nó phải là tội lỗi. Vì vậy, có bạn đi. –

Trả lời

8

Tác giả đang sử dụng cụm từ "cách ly" về cơ bản để có nghĩa là trình nạp lớp bootstrap cho JVM (trình nạp lớp "chính") không có bất kỳ lớp/lớp bổ sung nào trong đó (chỉ một lớp đơn giản) lên bộ nạp lớp con (s)). Bài viết không thực sự rõ ràng là tại sao điều này là "bị cô lập" bởi vì nó chỉ thiết lập một trình nạp lớp con. Cụm từ "cách ly" trở nên rõ ràng hơn khi bạn thiết lập nhiều hơn một trình nạp lớp con. Những trẻ em này sẽ bị cô lập với nhau vì chúng sẽ không chia sẻ bất kỳ lớp học nào (trừ các lớp JRE cốt lõi). Vì vậy, bạn có thể làm những việc như mỗi đứa trẻ sử dụng một phiên bản khác của cùng một cái lọ.

+0

Ví dụ: classloader1 = new URLClassLoader (oneUrl, parent); classloader2 = new URLClassLoader (anotherUrl, parent); sẽ tạo 2 trình nạp lớp được phân lập từ ea. khác, mỗi người có thể có các phiên bản khác nhau của một lớp nhất định (và có thể có các cách sử dụng khác), đúng không? – apollodude217

+1

@ apollodude217 - vâng, đó là chính xác. bit chính, mặc dù, không phải là oneUrl cũng không anotherUrl nên tham chiếu các lớp được nạp bởi trình nạp lớp cha (do đó ví dụ chạy trình nạp lớp chính không có thêm các jars). – jtahlborn

2

Đây là how to create an isolated classloader, bạn sẽ tạo bất kỳ lúc nào bạn muốn một đường dẫn lớp hệ thống không được phân loại, hữu ích cho việc khởi động các chương trình Java.

+0

Đây thực sự là một trong những bài viết tôi đọc khi cố gắng tìm kiếm những gì mà một trình nạp lớp bị cô lập, và nó không rõ ràng với tôi từ ngữ cảnh nó là gì. Tôi thấy những gì tác giả đang làm, nhưng tôi không biết những gì một phần trong đó làm cho classloader của mình "cô lập". – apollodude217

1

Từ sự hiểu biết của tôi từ bài viết mà bạn đã liên kết với bộ nạp lớp cô lập đó là trình tải lớp riêng biệt với bộ nạp lớp hệ thống chính. Tức là, các lớp được nạp bởi trình nạp lớp riêng biệt sẽ không có sẵn cho mọi lớp trong JRE (chỉ những lớp mà trình nạp lớp riêng lẻ nạp chính nó [và bất kỳ lớp nào được nạp bởi bất kỳ trình nạp lớp con nào]).

Điều này có thể hữu ích vì hai trong số các phụ thuộc của bạn có thể yêu cầu các phiên bản khác nhau của cùng một thư viện để chạy. Đó là, các phụ thuộc của bạn có thể mong đợi để xem các instantiations khác nhau của cùng một lớp trong thư viện. Do đó, cho chúng hai trình nạp lớp riêng biệt được tách biệt sẽ cho phép chúng tải các lớp mà chúng yêu cầu và không can thiệp lẫn nhau.

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