ホームページ >Java >&#&チュートリアル >Java はクラスローディングで同じ JAR ファイルの複数のバージョンをどのように処理しますか?
Java クラスローディングのジレンマ: 同じ Jar の複数のバージョンの処理
Java ライブラリを使用する場合、異なるバージョンを必要とするプロジェクトに遭遇することは珍しくありません。同じライブラリのメジャー バージョン。クラスローダーがこれらのバージョンをきちんと分離すると期待する人もいるかもしれませんが、実際はより複雑であることがよくあります。
クラスローダーの制限
Java クラスローダーは、複数のバージョンを明示的に処理するように設計されていません。同じ図書館の。これは、親優先委任モデルに従っており、各クラスローダーは、それ自体をロードしようとする前に、クラスのロードをその親に委任します。これは、同じバイナリ名を持つ 2 つのクラスが、異なるクラスローダーによってロードされた異なる jar に存在する場合、バージョンに関係なく、クラスパス階層で見つかった最初のクラスがロードされることを意味します。
クラスの解決と競合
クラスローダーがクラスを解決しようとするとき、次のように検索します。 order:
階層内のどのクラスローダーもクラスを見つけられない場合の場合、ClassNotFoundException がスローされます。クラスパスには同じクラスを含む複数の jar が含まれる場合がありますが、ロードされるのは 1 つだけです。このようなシナリオでは、他の jar のクラスにアクセスできなくなります。
依存関係の競合の処理
この問題に対処するために、開発者にはいくつかのオプションがあります。
アーティファクトのリンク
場合によっては、複数の jar を 1 つの「パッケージ」として扱うことが望ましい場合があります。これはクラスパス操作を通じて実現できます。 「-provided」フラグを使用してクラスパスで必要な jar を指定すると、クラスローダーは必要なすべてのクラスを jar からロードします。これにより、jar が効果的に「リンク」され、まとまった単位として扱えるようになります。
結論
クラスローダーはクラスの読み込みを処理するように設計されており、複数のバージョンを処理します。同じ瓶を使用するのは難しい場合があります。クラスローダーの動作を理解することで、開発者は潜在的な競合を軽減し、プロジェクト内の依存関係を効果的に管理できます。
以上がJava はクラスローディングで同じ JAR ファイルの複数のバージョンをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。