Cách duy nhất mà Class có thể được dỡ tải là nếu Classloader được sử dụng là rác được thu thập. Điều này có nghĩa là, các tham chiếu đến mỗi lớp đơn lẻ và chính trình nạp lớp cần phải đi theo con đường của dodo.
Một giải pháp khả thi cho vấn đề của bạn là có Trình tải lớp cho mỗi tệp jar và Trình nạp lớp cho mỗi Trình ứng dụng ủy nhiệm việc tải các lớp thực tế cho các trình nạp lớp Jar cụ thể. Bằng cách đó, bạn có thể trỏ đến các phiên bản khác nhau của tệp jar cho mọi máy chủ Ứng dụng.
Điều này không tầm thường, mặc dù. Nền tảng OSGi cố gắng làm điều này, vì mỗi gói có một trình nạp lớp khác nhau và các phụ thuộc được giải quyết bởi nền tảng. Có lẽ một giải pháp tốt sẽ là xem xét nó.
Nếu bạn không muốn sử dụng OSGI, một cách triển khai có thể là sử dụng một thể hiện của lớp JarClassloader cho mỗi tệp JAR.
Và tạo một lớp MultiClassloader mới, mở rộng Classloader. Lớp này bên trong sẽ có một mảng (hoặc Danh sách) của JarClassloaders và trong phương thức notifyClass () sẽ lặp qua tất cả các trình nạp lớp bên trong cho đến khi có thể tìm thấy một định nghĩa hoặc ném NoClassDefFoundException. Một vài phương thức truy cập có thể được cung cấp để thêm JarClassloaders mới vào lớp. Có một số triển khai có thể có trên mạng cho MultiClassLoader, do đó bạn thậm chí có thể không cần phải viết riêng.
Nếu bạn kích hoạt MultiClassloader cho mọi kết nối đến máy chủ, về nguyên tắc, có thể mọi máy chủ đều sử dụng một phiên bản khác nhau của cùng một lớp.
Tôi đã sử dụng ý tưởng MultiClassloader trong một dự án, trong đó các lớp có chứa các tập lệnh do người dùng định nghĩa phải được tải và tải khỏi bộ nhớ và nó hoạt động khá tốt.