私はコードベースで2つの異なるバージョンのAPIをサポートする方法を見つけようとしています。彼らは同じパッケージ名を持っていますが、フードの下では大きく異なる(2つの全く異なるシステム)。これどうやってするの?JavaのAPIの2つのバージョンをサポートする
これらのAPIの両方ともBouncy Castleに依存していますが、異なるバージョンのAPIを使用しています。これをどのように考慮に入れるか?
私はコードベースで2つの異なるバージョンのAPIをサポートする方法を見つけようとしています。彼らは同じパッケージ名を持っていますが、フードの下では大きく異なる(2つの全く異なるシステム)。これどうやってするの?JavaのAPIの2つのバージョンをサポートする
これらのAPIの両方ともBouncy Castleに依存していますが、異なるバージョンのAPIを使用しています。これをどのように考慮に入れるか?
私が最初に行う解決策は、親クラスより先に子クラスをロードするカスタムクラスローダーにAPIをロードすることです。 APIの内部でBouncy Castleをコンパイルする場合は、別々にロードすることについて心配する必要はありません。実行時にBouncy Castle jarを動的にロードすると、カスタムクラスローダーでBouncy CastleとそのAPIをそのクラスローダに追加します。 URLClassLoader
を使用して、親の最後の読み込みについては下のリンクを参照してください。
APIの1つのバージョンをロードするために必要なロジックに基づいて適切なクラスをロードするカスタムクラスローダを作成できます。
あなたは何をやっている知っている限り、私はこれをお勧めしませんが、次のようにURLClassLoaderを使用することができます。
URLClassLoader classLoaderA = URLClassLoader.newInstance(new URL[] {new URL("versionA.jar")});
URLClassLoader classLoaderB = URLClassLoader.newInstance(new URL[] {new URL("versionB.jar")});
は、クラスをロードします。
classLoaderA.loadClass("SomeClass");
別オプションはOSGIです。
これは、バウンシーキャッスルの別バージョンの読み込みと、同じクラスの複数のバージョンをAPIからロードするという主な問題を説明していません。あなたのメソッドは親の読み込みを最初に行い、正しくプログラミングされていない場合はClassNotFoundの意味を持ちます。 – Underbalanced
ビルド済みのjarファイルでもパッケージの名前を変更するツールを使うことができます。あるいは、OSGiのようなものを使うこともできます(パッケージの名前を変更する方が簡単です) –
あなた自身のコードでどのようにライブラリを使う予定ですか? 2つの異なるバージョンは、2つの異なるメソッドのシグネチャを意味します(たとえば)...アプリケーションの2つの異なるバージョンを作成する必要があります...私はここに他の選択肢はありません... – Pras
@PeterLawreyどのツールを使用したかあなたは知っていますか?私はちょうど "ジャージャーリンクス"と呼ばれるものがこれを行うように見える。 – Rob