2017-06-26 6 views
0

私は現在、別のプログラムによってプラグインとして取り込まれたプログラムに取り組んでいます。親プログラム(プラグインをとるプログラム)には独自の依存関係がありますが、私の場合、問題の一つはGuavaです。親はバージョン21.0を持っていますが、私が作成しているプラ​​グインはバージョン20.0を必要とする依存関係を持っていますが、新しいバージョンとは連携していないようで、プラグインのバージョンに関係なく、 dr:親プログラムがより高いバージョンを使用している場合、より低いバージョン(私の場合は20.0)の従属関係を使用する方法はありますか? (プラグインは反映されている可能性がありますので、常に親の依存関係を使用するでしょうか?プラグインは依存関係を組み込んで構築されています)子は親よりもMavenで依存関係がどのように異なるのですか?

+1

同じクラスの2つのバージョンを並べて使用することはできません彼らが別のパッケージに入っていない限り。依存ライブラリのために、その特定のクラス/パッケージの古いバージョンを独自のプロジェクトに抽出することは可能かもしれませんが、独自のコードでも同様に使用されます。 – shmosel

答えて

1

Mavenはビルドツールであり、実行時(つまり、アプリケーションがすでに実行中のとき)に実行されます。だから、これは問題ではないので、解決策を探す場所ではありません。

ホスティングアプリケーションを制御するのではなく、プラグインのみであれば、プラグインとアプリケーションに共通する依存バージョンと同じバージョンを使用するのではなく、選択肢がありません。

ホスティングアプリケーションとプラグインの両方を所有(制御)している場合は、プラグインを正しく処理する必要があります。言うことは簡単ですが、やりにくいです...
すでに解決している既存のフレームワークを探してください。
いくつかの例は以下のとおりです。OSGiJPFPF4J、そしてより多くのがあります...
また、以下のSOFの質問に見てみましょう:これは、古典的な問題であるnutshell-

Best way to build a Plugin system with Java

アプリケーションでのプラグインのサポート
私の意見では、ホスティングアプリからプラグインを分離するのが最善の解決策です。これは、異なるクラスローダを使用して、もちろん、反映することで実現できます。

アプリケーションは実行されており、そのクラスは「通常」の方法で読み込まれます。ここでは何も表示されません。しかし、実行時にアプリケーションの依存関係からプラグインのコードを分離するには、別のクラスローダー(たとえばURLClassLoader)を使用してプラグインクラスと依存関係をロードする必要があります。このクラスローダーがアプリケーションのクラスローダーを親として持たないことは非常に重要です。そうしないと、(今までのように)バージョン管理上の問題が発生します。

EDIT:
上であなただけのコントロールを持っているときに、このような状況を処理するための別のオプションあなたのあなたは、例えば、独自のクラスローダを書き、(プラグインのエントリポイントでそれを使用することができます
plugin-エントリポイントを除くすべてのプラグインクラスがこのクラスローダを使用してロードされます)。これを行うには、まずプラグインjarからクラスをロードして親ローダーに委譲しようとする方法でクラスローダーを記述する必要があります。これは実現可能です(実際にはそれほど難しくありません)が、クラスローダー契約(親に最初に委任し、見つからない場合には自分でロードする)に反対します。
私はまだ、アプリケーションが新しいバージョンを持っている場合は、特に同じ依存関係を使用することを確認する方がはるかに優れていると思います。

+0

ありがとう、悲しいことに、プラグインを取っているサービスは私のコントロール外です。私は現在のシステムに対処しなければなりません。したがって、この問題を解決するために別のクラスローダーを使用することはできません。私の知識は限られていますが、下位バージョンのソースはプラグインjarに格納され、依存性の低いクラスからクラスをロードするときにのみ参照できますか? – StaticShadow

+0

たとえば、独自のクラスローダーを作成し、プラグインのエントリーポイントで使用することができます(このクラスローダーを使用して、エントリーポイントを除くすべてのプラグインクラスがロードされます)。これを行うには、まずプラグインjarからクラスをロードして親ローダーに委譲しようとする方法でクラスローダーを記述する必要があります。これは実現可能であり(実際にはそれほど難しくありませんが)、クラスローダー契約に反対しています。 – yinon

関連する問題