Єдиний спосіб, що Клас може бути вивантажений, це якщо використовуваний завантажувач класів збирається сміттям. Це означає, що посилання на кожен клас та на сам завантажувач класів повинні йти шляхом dodo.
Одне з можливих варіантів вирішення вашої проблеми - мати завантажувач класів для кожного файлу jar та клас завантажувач для кожного AppServers, який делегує фактичне завантаження класів конкретним завантажувачам Jar. Таким чином, ви можете вказати на різні версії файлу jar для кожного сервера додатків.
Однак це не банально. Платформа OSGi прагне зробити це саме так, оскільки кожен комплект має різний завантажувач класів, а залежності вирішуються платформою. Можливо, хорошим рішенням було б поглянути на це.
Якщо ви не хочете використовувати OSGI, можливою реалізацією може бути використання одного примірника класу JarClassloader для кожного файлу JAR.
І створити новий клас MultiClassloader, який розширює Classloader. Цей клас внутрішньо матиме масив (або Список) JarClassloaders, а в методі defineClass () буде перебиратися через усі внутрішні завантажувачі класів, поки не буде знайдено визначення або не буде викинуто NoClassDefFoundException. Для додавання нових JarClassloaders до класу можна надати кілька методів аксесуарів. У мережі є кілька можливих реалізацій для MultiClassLoader, тому вам може навіть не потрібно писати власні.
Якщо ви створюєте екземпляр MultiClassloader для кожного з'єднання з сервером, в принципі можливо, кожен сервер використовує іншу версію одного класу.
Я використовував ідею MultiClassloader в проекті, де класи, які містили визначені користувачем сценарії, повинні були завантажуватися та вивантажуватися з пам'яті, і це працювало досить добре.