私は現在、別のプログラムによってプラグインとして取り込まれたプログラムに取り組んでいます。親プログラム(プラグインをとるプログラム)には独自の依存関係がありますが、私の場合、問題の一つはGuavaです。親はバージョン21.0を持っていますが、私が作成しているプラグインはバージョン20.0を必要とする依存関係を持っていますが、新しいバージョンとは連携していないようで、プラグインのバージョンに関係なく、 dr:親プログラムがより高いバージョンを使用している場合、より低いバージョン(私の場合は20.0)の従属関係を使用する方法はありますか? (プラグインは反映されている可能性がありますので、常に親の依存関係を使用するでしょうか?プラグインは依存関係を組み込んで構築されています)子は親よりもMavenで依存関係がどのように異なるのですか?
答えて
Mavenはビルドツールであり、実行時(つまり、アプリケーションがすでに実行中のとき)に実行されます。だから、これは問題ではないので、解決策を探す場所ではありません。
ホスティングアプリケーションを制御するのではなく、プラグインのみであれば、プラグインとアプリケーションに共通する依存バージョンと同じバージョンを使用するのではなく、選択肢がありません。
ホスティングアプリケーションとプラグインの両方を所有(制御)している場合は、プラグインを正しく処理する必要があります。言うことは簡単ですが、やりにくいです...
すでに解決している既存のフレームワークを探してください。
いくつかの例は以下のとおりです。OSGi、JPF、PF4J、そしてより多くのがあります...
また、以下のSOFの質問に見てみましょう:これは、古典的な問題であるnutshell-
でBest way to build a Plugin system with Java
アプリケーションでのプラグインのサポート
私の意見では、ホスティングアプリからプラグインを分離するのが最善の解決策です。これは、異なるクラスローダを使用して、もちろん、反映することで実現できます。
アプリケーションは実行されており、そのクラスは「通常」の方法で読み込まれます。ここでは何も表示されません。しかし、実行時にアプリケーションの依存関係からプラグインのコードを分離するには、別のクラスローダー(たとえばURLClassLoader
)を使用してプラグインクラスと依存関係をロードする必要があります。このクラスローダーがアプリケーションのクラスローダーを親として持たないことは非常に重要です。そうしないと、(今までのように)バージョン管理上の問題が発生します。
EDIT:
上であなただけのコントロールを持っているときに、このような状況を処理するための別のオプションあなたのあなたは、例えば、独自のクラスローダを書き、(プラグインのエントリポイントでそれを使用することができます
plugin-エントリポイントを除くすべてのプラグインクラスがこのクラスローダを使用してロードされます)。これを行うには、まずプラグインjarからクラスをロードして親ローダーに委譲しようとする方法でクラスローダーを記述する必要があります。これは実現可能です(実際にはそれほど難しくありません)が、クラスローダー契約(親に最初に委任し、見つからない場合には自分でロードする)に反対します。
私はまだ、アプリケーションが新しいバージョンを持っている場合は、特に同じ依存関係を使用することを確認する方がはるかに優れていると思います。
ありがとう、悲しいことに、プラグインを取っているサービスは私のコントロール外です。私は現在のシステムに対処しなければなりません。したがって、この問題を解決するために別のクラスローダーを使用することはできません。私の知識は限られていますが、下位バージョンのソースはプラグインjarに格納され、依存性の低いクラスからクラスをロードするときにのみ参照できますか? – StaticShadow
たとえば、独自のクラスローダーを作成し、プラグインのエントリーポイントで使用することができます(このクラスローダーを使用して、エントリーポイントを除くすべてのプラグインクラスがロードされます)。これを行うには、まずプラグインjarからクラスをロードして親ローダーに委譲しようとする方法でクラスローダーを記述する必要があります。これは実現可能であり(実際にはそれほど難しくありませんが)、クラスローダー契約に反対しています。 – yinon
- 1. Maven 3を使用して子依存関係を親依存関係よりも優先させない
- 2. 異なるスコープの依存関係内のMaven依存関係
- 3. Maven 3の依存関係は親POMから子どもには利用できません
- 4. Mavenは親から継承した推移的な依存関係をどのように扱いますか?
- 5. Maven - テストで異なる依存関係のバージョン
- 6. maven-compiler-pluginの依存関係をどのように除外するか?
- 7. セレンサーバMavenの依存関係はどこにありますか?
- 8. クラスのLocalContainerEntityManagerFactoryBeanにはどのような依存関係が必要ですか?
- 9. LibreOffice Mavenの依存関係ですか?
- 10. Mavenプロジェクトの依存関係のようなファイルをプラグインでダウンロードしますか?
- 11. Mavenの依存関係は?
- 12. Sonatype.orgからMaven依存関係をどのようにインポートしますか?
- 13. gradleの依存関係の依存関係をどのように置き換えるのですか?
- 14. 文書にどのような依存関係がありますか?
- 15. npmスクリプトはグローバルな依存関係よりもローカルの依存関係をどのように優先しますか?
- 16. mavenは、アプリケーションがビルドする主な依存関係の依存関係をどのように解決しますか?
- 17. Mavenの同じ依存関係の異なるバージョン
- 18. グレードビルドの依存関係が異なる?
- 19. npmに依存関係の最新の依存関係が得られないようにするには
- 20. Mavenで親のプロジェクトから依存関係を除外する方法は?
- 21. Mavenは依存関係
- 22. Gemfileでbundlerを使って異なるRDBMS依存関係をどのように扱うべきですか?
- 23. Mavenソースコードの依存関係
- 24. Maven GWTの依存関係
- 25. HibernateのMaven依存関係
- 26. Mavenの依存関係
- 27. Mavenの依存関係
- 28. Maven依存関係のjava.lang.ClassNotFoundException
- 29. Mavenの依存関係
- 30. 流行の外部依存関係(ブートストラップのようなもの)
同じクラスの2つのバージョンを並べて使用することはできません彼らが別のパッケージに入っていない限り。依存ライブラリのために、その特定のクラス/パッケージの古いバージョンを独自のプロジェクトに抽出することは可能かもしれませんが、独自のコードでも同様に使用されます。 – shmosel