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