web-dev-qa-db-ja.com

Maven-同じ依存関係の複数のバージョン

依存関係が次の2つのjarを取り込むWebアプリケーションがあります。

  1. javassist-3.9.0.GA.jar
  2. javassist-3.20.0-GA.jar

wARをパッケージ化すると、これらの両方がWEB-INF/libディレクトリにあります。私の質問は、アプリケーションが実行されていることと、両方のjarに同じクラスがあり、問題があるはずなので、なぜ問題が発生しないのかということです正しい?

14
Toseef Zafar

Javaでは、提供するクラスのバージョンの数は関係ありません。デフォルトのクラスローダーは、見つけることができるクラスパス上の最初のクラスローダーを選択します。

エラーなしでアプリケーションを実行できるため、これは次のいずれかを意味します。

  • javassist-3.9.0.GA.jarがクラスパスの最初にある場合:アプリケーションはjavassist-3.20.0-GA.jarの新しいAPIまたはバグ修正に依存しません。また、このライブラリで使用したAPIはこれらのバージョン間で変更されません(ライブラリはマイナーバージョン間ですべきではありません)

  • javassist-3.20.0-GA.jarがクラスパスの最初にある場合:ライブラリは後方互換性があります

私は提案します:

  • これらの依存関係がアプリケーションのさまざまな部分の直接的な依存関係である場合は、同じバージョンをどこでも使用していることを確認してください。最善の方法は、親POMのdependencyManagementセクションのバージョンを修正し、dependenciesセクションのバージョン属性を省略することです。
  • これらの依存関係が推移的な依存関係である場合、使用したくない依存関係を除外して、最終アプリケーションにライブラリのバージョンが1つだけであることを確認します。また、古いバージョンをまだ使用しているプロジェクトの問題を報告し、依存関係のバージョンをアップグレードするよう依頼することを検討してください。
  • パッケージ名とクラス名が同じで、同じライブラリの2つの互換性のないバージョンを使用する必要がある場合は、OSGiなどのモジュールシステムを使用することを検討してください。
22
Puce

「それを修正する方法はありますか?」 依存関係ツリーを使用した競合の解決 をご覧ください。コマンドmvn dependency:tree依存関係の原因を知ることができます。 javassistに依存するアーティファクトがわかっている場合は、除外エントリを追加して、javassistバージョンの1つを回避できます。

4
polypiel