Javaクラスローダー ユーザー定義のクラスローダー

Weblio 辞書 > 辞書・百科事典 > 百科事典 > Javaクラスローダーの解説 > ユーザー定義のクラスローダー 

Javaクラスローダー

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/02/25 00:16 UTC 版)

ユーザー定義のクラスローダー

既定では、ユーザーのクラスは全てシステムクラスローダーからロードされるが、ユーザーが定義した ClassLoader に置き換えたり、さらにクラスローダーの連結構造をユーザー定義したり、といったこともできる。

これにより、たとえば以下のようなことが可能になる:

  • クラスのロード・アンロードを実行時に行う。たとえば、実行時にHTTPリソースからライブラリを動的にロードするなど。これは以下の用途において重要な機能である:
  • Javaバイトコードがロードされる方法を変える (たとえば、暗号化されたJavaクラスをロードする[5])。
  • ロード済みのバイトコードを改変する (たとえば、アスペクト指向プログラミングで用いれば、ロード時の織り込み)。

Jakarta EEにおけるクラスローダー

Jakarta EE (旧・Java EE) のアプリケーションサーバーは、通例サーバーに配置されたWAREARアーカイブを階層的に配置されたクラスローダーでロードして、アプリケーション同士を隔離している。 いわゆる"サーブレットコンテナ"は、通例複数のクラスローダーを用いて実装されている[2][6]

JAR地獄

DLL地獄に似た言葉としてJAR地獄という言葉があるが、これはクラスのロードが思ったとおりに行われない状況全般を指して使われる[7]

JAR地獄の発生する状況としては次の3つがある。

  • 一つ目は、Javaアプリケーションの開発や配置の際に、たまたま同じライブラリの複数のバージョンが同時に利用可能になってしまった場合である。この場合、処理系はエラーを発生させず、単純にどちらか一方のライブラリからのみクラスをロードする。使用するライブラリのリストに新しいライブラリを追加(置き換えではなく)した場合、アプリケーションは古いライブラリを使っているのと同じ振る舞いになるものと考えられる。
  • 問題が発生するもう一つの状況は、2つのライブラリAとB(または、アプリケーションAとそれが使っているライブラリB)が、別のライブラリCの異なるバージョンをそれぞれ要求している場合である。 ライブラリCの各バージョンでクラス名が変わらないなら、ライブラリCの各バージョンを一つのクラスローダーで同時にロードする方法は存在しない。
  • JAR地獄で最も複雑な問題は、クラスローダーの複雑性によって発生する。Javaプログラムでは単一の「フラットな」クラスローダーだけでなく、ネストした、協調して動作する複数の(場合によっては非常に多くの)クラスローダーを使用できる。別々のクラスローダーによってロードされたクラスは複雑に相互作用するが、開発者がその機序を十分に理解していない場合、不可解なエラーやバグが発生する[8]

OSGiアライアンスは、現在および将来において、広く利用されているJava MEJava SEJakarta EEの各VMでJAR地獄を解決するべく、モジュール方式のフレームワークを策定している(1998年のJSR 8から始まっている)。これは、JARマニフェスト英語版中に書かれたメタデータを使い、JARファイル(バンドルと呼ばれる)をパッケージ単位で操作するものである。バンドルはパッケージをエクスポートしたりインポートしたり、パッケージをプライベートに保っておいたりすることができ、これにより基本的なモジュール化と、バージョン付けされた依存関係管理が行える。

JAR地獄に対する改善策として、2005年にJava Community ProcessによるJSR 277の策定が始まり、その結果として「Java Module System」が定義された。これは、配布フォーマット、モジュールのバージョン体系、共通モジュールのリポジトリ(目的は.NET FrameworkGlobal Assembly Cacheに類似)をJavaに導入することを目的としていたが、バージョニングの問題などで論争が起き[9]、2008年12月、SunはJSR 277を保留とすることを発表した[10]。その後、後継となるJSR 376のJavaプラットフォームモジュールシステム英語版としてJava 9で正式に導入された[11]。2017年にリリースされたJava 9には、「Java Platform Module System」と呼ばれるモジュール型ソフトウェアのサポートが含まれており、module-info.javaファイルによってソースレベルで制御される。下位互換性のある方法でJava ランタイム環境にモジュール性を提供することを目的とした OSGi アーキテクチャとは異なる哲学に従っており、JRE が提供するクラスをロードするデフォルトのメカニズムを使用する。しかし異なるバージョンのライブラリの共存を制御する機能は提供しないため、JAR地獄問題への取り組みには適していない。[12]


注釈

  1. ^ core.jarserver.jarrt.jarなどのJARファイルに格納されている。

出典

  1. ^ Binildas, Mcmanis (1996年1月10日). “The basics of Java class loaders”. JavaWorld. 2008年1月26日閲覧。[リンク切れ]
  2. ^ a b Binildas, Christudas (2005年1月26日). “Internals of Java Class Loading”. onjava.com. 2009年10月2日閲覧。[リンク切れ]
  3. ^ Understanding Extension Class Loading”. java.sun.com (2008年2月14日). 2008年1月26日閲覧。
  4. ^ Dennis, Sosnoski (2003年4月29日). “Classes and class loading”. ibm.com. 2008年1月26日閲覧。[リンク切れ]
  5. ^ Vladimir, Roubtsov (2003年9月5日). “Cracking Java byte-code encryption”. javaworld.com. 2008年1月26日閲覧。[リンク切れ]
  6. ^ Tim, deBoer (2002年8月21日). “J2EE Class Loading Demystified”. ibm.com. 2008年1月26日閲覧。[リンク切れ]
  7. ^ http://incubator.apache.org/depot/version/jar-hell.html[リンク切れ]
  8. ^ クラスローダーとJ2EEパッケージング戦略を理解する: 第2回「クラスローダーを理解する - シングルトンがシングルトンでなくなる日」| IBM, Internet Archive
  9. ^ JSR 277論争、バージョニングで再燃 | InfoQ
  10. ^ http://www.osgi.org/News/20081217[リンク切れ]
  11. ^ イマドキのJava徹底入門(4) Javaのモジュールシステムを理解しよう(その1) | TECH+
  12. ^ Bartlett, Neil; Hackbarth, Kai (2016年9月22日). “Java 9, OSGi and the Future of Modularity (Part 1)”. 2024年2月25日閲覧。


「Javaクラスローダー」の続きの解説一覧



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Javaクラスローダー」の関連用語

Javaクラスローダーのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Javaクラスローダーのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのJavaクラスローダー (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS