2016-04-14 6 views
3

私は多くの検索を行いましたが、この質問に対する答えは見つかりませんでした。たぶん、これは行われますが、ここではSomeLibrary-V1.jarに私ははA.jarは(間接的に)依存ではA.jarがSomeLibrary-V2.jar 異なるクラスに使用されるjarファイルの2つのバージョンが必要です

  • のClass1に依存

    1. を持っているものだことはできません。

    と私ははA.jarからV1クラスまたはクラスを取得するためにV2

  • Class1の(とそれがためのローディングをトリガーするクラス)からそのクラスを取得するために

    1. はA.jarが欲しいです必要に応じて。

    私は自分でchild-first classloaderと書くことができ、必要に応じてClass1を名前で読み込むことができます。このクラスローダーはSomeLibrary-V1.jarを最初に(親クラスローダーの前に)検索します。ただし、Class1のクラスローダーは、クラスローダーに設定されません。これは、そのクラスローダーが親クラスに遅延するためです。これは、Class1がSomeLibrary-V1.jarから来たいクラスをロードしようとすると、私の子クラスローダーが使用されないことを意味します。

    Class1クラスのクラスローダーとして設定する必要があると思います。クラスローダーをクラスローダーインスタンスに設定するためにイントロスペクションを見ましたが、クラスオブジェクトのclassLoaderフィールドは公開されていません。別の方法は、私のクラスローダーからdefinedClass()を呼び出すことですが、実際には両親を使用することはできません。

    私はthisを見ましたが、そこにはクラスローダーの作成が示唆されていますが、詳細は記載されていません。私はその解決策に関する追加の質問/問題を呼び出すいくつかの詳細をここに示しました(私は望みます - コメントを追加する担当者はいません)。

    私はここで何かを逃してくれることを願っています。助けてくれてありがとう。

  • +0

    「Java Classloader - 異なるバージョンのjarを参照する方法」の複製が可能です。(http://stackoverflow.com/questions/1553567/java-classloader-how-to-reference-different-versions-of-a- jar) – Ferrybig

    +0

    ここで問題を動機づけるだけです。私はRESTfulなサービスを構築しており、Sparkを使っていくつかの機能を追加する必要がありました。 SparkはJersey 1.xを使用し、Jersey 2.xを使用してパスを開始しました。 –

    答えて

    3

    JAR Hellへようこそ!クラスパスがJavaで動作するという単純な方法のため、これは簡単にはできません。

    解決策はありますが、簡単で迅速な修正はありません。あなたがすでに見つけたように、あらゆる種類のクラスローダートリックを行うか、OSGiのようなモジュールシステムを使うことができます。

    Java 9がリリースされたときに、標準モジュールシステムを使用することで、これが将来的にはうまくいくことが期待されます。

    0

    解決策は可能ですが、そのような解決策は非常に脆弱な解決策になります。それは、ほとんどの場合、その価値の問題を引き起こすでしょう。同じlibの異なるバージョンへの依存を避けることが可能であれば、私は言うでしょう。問題の症状としてそのような依存関係があり、根本原因を解決しようとしているという事実を見てください。

    関連する問題