クラスをアンロードできる唯一の方法は、使用されているクラスローダーがガベージ コレクションされている場合です。つまり、すべての単一クラスへの参照とクラスローダー自体への参照は、ドードーの道をたどる必要があります。
問題の解決策の 1 つは、すべての jar ファイルにクラスローダーを用意し、クラスの実際のロードを特定の Jar クラスローダーに委譲する各 AppServer にクラスローダーを用意することです。そうすれば、アプリケーション サーバーごとに異なるバージョンの jar ファイルを指定できます。
ただし、これは簡単なことではありません。各バンドルには異なるクラスローダーがあり、依存関係はプラットフォームによって解決されるため、OSGi プラットフォームはまさにこれを行うよう努めています。たぶん、それを見てみるのが良い解決策になるでしょう。
OSGI を使用したくない場合、可能な実装の 1 つは、JAR ファイルごとにJarClassloaderクラスの 1 つのインスタンスを使用することです。
そして、Classloader を拡張する新しい MultiClassloader クラスを作成します。このクラスは内部的に JarClassloader の配列 (またはリスト) を持ち、defineClass() メソッドでは、定義が見つかるまで、または NoClassDefFoundException がスローされるまで、すべての内部クラスローダーを反復処理します。新しい JarClassloader をクラスに追加するために、いくつかのアクセサ メソッドを提供できます。ネット上には MultiClassLoader の可能な実装がいくつかあるため、独自のものを作成する必要さえないかもしれません。
サーバーへの接続ごとに MultiClassloader をインスタンス化すると、原則として、すべてのサーバーが同じクラスの異なるバージョンを使用する可能性があります。
私はプロジェクトで MultiClassloader のアイデアを使用しました。このプロジェクトでは、ユーザー定義のスクリプトを含むクラスをメモリからロードおよびアンロードする必要があり、非常にうまく機能しました。