2016-07-05 2 views
0

私は特定のライブラリの2つの異なるバージョンを扱っています。ユーザーがオブジェクトを選択すると、そのオブジェクトを作成したライブラリのバージョンが認識されます。今、私はそのバージョンに対応するコードを実行する必要があります。実行時に別のバージョンのjarファイルを読み込んでアンロードする

問題は、両方のライブラリバージョンでコードが冗長で、各バージョンがそのバージョンで作成されたオブジェクトに対してのみ有効であることです。

  • が必要とされているjarファイルを、ロードに必要されていないjarファイルを、アンロード:私はその結果が、私は、実行時に次の操作を実行する必要があること、である、と思います。

URLClassLoaderを使用すると可能でしょうか?どういうわけかこれ?

File dirVersion3= new File("lib/dirVersion3"); 
File dirVersion4= new File("lib/dirVersion4"); 
URL[] url={dirVersion4.toURL()}; 

ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader(); 
URLClassLoader loader = new URLClassLoader(url, currentThreadClassLoader); 
Thread.currentThread().setContextClassLoader(loader); 
+0

これは、アプリケーションサーバー上に展開ユーティリティのスタンドアロンのJavaクラスまたはその一部であるの多くを書くのか? – Sampada

+0

基本的に、ライブラリごとに新しいクラスローダーを作成する場合は、両方のバージョンを同時に使用できるようにすることができます。 2つの異なる(ピア)クラスローダーで同じクラスをロードすると、CL1がロードした 'ClassA'は、CLがロードされたクラスオブジェクトの一部であるため、CL2によってロードされた' ClassA'と同じではありません!あなたができることは、両方のJARバージョンが使用しているライブラリへの共通コードをリファクタリングすること、共通のCLまたはアプリケーションCLで共通のJARをロードし、このCLをバージョン固有のCLの親として使用することです。 –

答えて

0

私はあなたが2つのオプションがあると思う:

  1. jarjarとライブラリの再パッケージ1つのバージョン(https://github.com/shevek/jarjarを)ので、それは別のパッケージ名を取得します。この方法で、両方のバージョンを同じClassLoaderに同時にロードできます。
  2. 2クラスローダ負荷1つのライブラリのバージョンごとに作成し、委任と反射コード
関連する問題