ホームページ >Java >&#&チュートリアル >Java はクラスローディングで同じ JAR ファイルの複数のバージョンをどのように処理しますか?

Java はクラスローディングで同じ JAR ファイルの複数のバージョンをどのように処理しますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-30 06:37:10696ブラウズ

How Does Java Handle Multiple Versions of the Same JAR File in Classloading?

Java クラスローディングのジレンマ: 同じ Jar の複数のバージョンの処理

Java ライブラリを使用する場合、異なるバージョンを必要とするプロジェクトに遭遇することは珍しくありません。同じライブラリのメジャー バージョン。クラスローダーがこれらのバージョンをきちんと分離すると期待する人もいるかもしれませんが、実際はより複雑であることがよくあります。

クラスローダーの制限

Java クラスローダーは、複数のバージョンを明示的に処理するように設計されていません。同じ図書館の。これは、親優先委任モデルに従っており、各クラスローダーは、それ自体をロードしようとする前に、クラスのロードをその親に委任します。これは、同じバイナリ名を持つ 2 つのクラスが、異なるクラスローダーによってロードされた異なる jar に存在する場合、バージョンに関係なく、クラスパス階層で見つかった最初のクラスがロードされることを意味します。

クラスの解決と競合

クラスローダーがクラスを解決しようとするとき、次のように検索します。 order:

  1. 現在のクラスローダー
  2. 親クラスローダー
  3. ブートストラップ クラスローダー

階層内のどのクラスローダーもクラスを見つけられない場合の場合、ClassNotFoundException がスローされます。クラスパスには同じクラスを含む複数の jar が含まれる場合がありますが、ロードされるのは 1 つだけです。このようなシナリオでは、他の jar のクラスにアクセスできなくなります。

依存関係の競合の処理

この問題に対処するために、開発者にはいくつかのオプションがあります。

  • バージョン管理: バージョンを回避するために、プロジェクト全体でライブラリの特定のバージョンを強制します
  • モジュール システム: Java 9 のモジュール システムを利用して、モジュール内のライブラリの異なるバージョンを分離します。
  • クラスローダーのオーバーライド: カスタム クラスローダーを作成します。デフォルトのクラスロード動作をオーバーライドして、特定のバージョンのクラスをロードします。
  • Jar のマージ: 異なるバージョンを含む jar を 1 つのアーティファクトにマージします。

アーティファクトのリンク

場合によっては、複数の jar を 1 つの「パッケージ」として扱うことが望ましい場合があります。これはクラスパス操作を通じて実現できます。 「-provided」フラグを使用してクラスパスで必要な jar を指定すると、クラスローダーは必要なすべてのクラスを jar からロードします。これにより、jar が効果的に「リンク」され、まとまった単位として扱えるようになります。

結論

クラスローダーはクラスの読み込みを処理するように設計されており、複数のバージョンを処理します。同じ瓶を使用するのは難しい場合があります。クラスローダーの動作を理解することで、開発者は潜在的な競合を軽減し、プロジェクト内の依存関係を効果的に管理できます。

以上がJava はクラスローディングで同じ JAR ファイルの複数のバージョンをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。