2016-05-17 8 views
6

私はコードベースで2つの異なるバージョンのAPIをサポートする方法を見つけようとしています。彼らは同じパッケージ名を持っていますが、フードの下では大きく異なる(2つの全く異なるシステム)。これどうやってするの?JavaのAPIの2つのバージョンをサポートする

これらのAPIの両方ともBouncy Castleに依存していますが、異なるバージョンのAPIを使用しています。これをどのように考慮に入れるか?

+2

ビルド済みのjarファイルでもパッケージの名前を変更するツールを使うことができます。あるいは、OSGiのようなものを使うこともできます(パッケージの名前を変更する方が簡単です) –

+0

あなた自身のコードでどのようにライブラリを使う予定ですか? 2つの異なるバージョンは、2つの異なるメソッドのシグネチャを意味します(たとえば)...アプリケーションの2つの異なるバージョンを作成する必要があります...私はここに他の選択肢はありません... – Pras

+1

@PeterLawreyどのツールを使用したかあなたは知っていますか?私はちょうど "ジャージャーリンクス"と呼ばれるものがこれを行うように見える。 – Rob

答えて

1

私が最初に行う解決策は、親クラスより先に子クラスをロードするカスタムクラスローダーにAPIをロードすることです。 APIの内部でBouncy Castleをコンパイルする場合は、別々にロードすることについて心配する必要はありません。実行時にBouncy Castle jarを動的にロードすると、カスタムクラスローダーでBouncy CastleとそのAPIをそのクラスローダに追加します。 URLClassLoaderを使用して、親の最後の読み込みについては下のリンクを参照してください。

How do I create a parent-last/child-first ClassLoader in Java, or How to override an old Xerces version that was already loaded in the parent CL?

0

APIの1つのバージョンをロードするために必要なロジックに基づいて適切なクラスをロードするカスタムクラスローダを作成できます。

2

あなたは何をやっている知っている限り、私はこれをお勧めしませんが、次のように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です。

+0

これは、バウンシーキャッスルの別バージョンの読み込みと、同じクラスの複数のバージョンをAPIからロードするという主な問題を説明していません。あなたのメソッドは親の読み込みを最初に行い、正しくプログラミングされていない場合はClassNotFoundの意味を持ちます。 – Underbalanced

関連する問題