2009-10-12 37 views
19

これはよくある問題です。私は2つのライブラリA.jarB.jarを使用しています。これらは同じJarの異なるバージョンに依存しています。
私はその依存関係に対して特定のjar(はA.jar/B.jar)をコンパイルすることができますが、実行時に、私は1つだけをロードするようにしましたのは、実行時に、私はTHIS.xxxjarJava Classloader - 異なるバージョンのjarを参照する方法

MY.jar 
    -> A.jar -> THIS.1.0.0.jar 
    -> B.jar -> C.jar -> THIS.5.0.0.jar 

を必要としましょうバージョン。どれ?
1つの依存関係(最新バージョン)のみをロードすると、ライブラリが下位互換性がない場合(実行可能な下位互換ライブラリはありますか?)、実行時例外が発生する可能性があります。

とにかく私はOSGiのようなものがこの問題を解決できることを知っています。私はこの種の問題を修正する古い方法何思ったんだけど
...

どうもありがとう

+0

これは可能ですか?OSGiがどのように役立つかOSGiには、一般的な製品ソフトウェア開発(特に組み込み向け)のオーバーヘッドがありますが、 – sskumar86

答えて

7

あなたが言及している(そしてOSGIが確かに使用している)「古い方法」は、依存関係の両方のブランチに対して独自のClassLoaderをインストールすることです。例えば、アプリケーションサーバーは、同じJVM内で同じアプリケーションの古いバージョンと新しいバージョンの両方を実行できます。

クラスローダー階層についての説明

設定では、トリッキーな部分は、両方のブランチからのクラスが合流するジョイントポイントです。どちらのブランチも、別のクラスにロードされたクラスを使用することはできません。それを動作させる方法は、ブートクラスローダー(JREクラス)またはMY.jarのクラスローダによってロードされたクラスだけが両方のブランチに渡されるようにすることです。

1

多くの図書館は、下位互換性があります。しかし、すべてではありません。


古い方法は1つのバージョンのみに依存しようとしています。

同じバージョン(最新)で両方をコンパイルする方が安全でしょう。
少なくとも、実行時エラーではなくコンパイル時エラーが発生します。

必要な場合は、古い依存で動作しますあなたのライブラリーを少し変更することができます...
これはソースへのアクセスを必要とする...


そのコンパイル時の互換性に注意してください。正しいランタイム動作を保証するものではありません。互換性の問題に

  • 書き込みJUnits
  • を報告ユーザーのためのインターネット上の外観はでコードを比較瓶
  • の新しいバージョンのための新着情報ファイルを読み込む

    • :それは、あなたができる一歩であり、両方のジャー
  • 4

    OSGiはこの問題を修正できます。 OSGiバンドルは、バージョンを詳述する追加のメタデータを持つjarファイルにすぎません。バンドルにはバージョン番号があり、依存するjarのバージョン番号(または範囲)が表示されます。

    詳細はthis introductory Javaworld articleをご覧ください。

    OSGiを使用せずにこれを解決するには、互換性のあるjarでコンパイルして実行することを手動で保証する必要があります。あなたが知ったように、それは必ずしも簡単な仕事ではありません。 jarファイルは必ずしもバージョンを識別するものではないので、チェックサムや署名を記録/比較するための唯一の確実な方法です。

    1

    KLEで述べたように、デフォルトの方法は新しいバージョンに依存することです。保証はありませんが、ほとんどの場合、これが機能します。おそらく最善の方法は(肥大化したものの)OSGIを使って乗り越えることです。

    0

    基本的な「oldway」実装のチェックアウトにhttps://github.com/atulsm/ElasticsearchClassLoader

    を参照するにはこれがelasticsearch、クライアントの使用状況の非後方互換性のあるバージョンを処理するためのアプローチを提供します。

    関連する問題