Javaプラットフォーム・モジュール・システム(JPMS )は、 Javaコードと関連リソースのコレクションの配布形式を規定しています。 [ 1 ]また、これらのコレクション(モジュール)を格納するリポジトリも規定し、それらの検出、ロード、整合性チェックの方法も規定しています。JPMSには、既存のJAR形式の欠点、特にクラスパスやクラスロードの問題につながる可能性のあるJAR Hellを修正することを目的として、名前空間などの機能が含まれています。
Java モジュール システムは当初、Java コミュニティ プロセスの下でJSR 277 として開発され、Java 7 とともにリリースされる予定でした。
JSR 277は後に保留となり、JDKをモジュール化するために Project Jigsaw [ 2 ]が作成されました。このJSRはJSR 376(Java Platform Module System)に置き換えられました。
プロジェクトジグソーは当初Java 7(2011)向けに計画されていましたが、プランBの一環としてJava 8(2014)に延期され、[ 3 ]、さらに2017年のJava 9リリースに延期されました。 [ 4 ] Javaモジュールシステムを含むJava 9は2017年9月21日にリリースされました。[ 5 ] [ 6 ]
建築
Java 9で実装されたJavaモジュールシステムには、以下のJEPとJSR(Java仕様要求)が含まれています。[ 2 ]
- JEP 200: モジュラーJDK: JDKのモジュラー構造を定義する
- JEP 201: モジュール型ソースコード: JDK ソースコードをモジュールに再編成し、モジュールをコンパイルするためのビルドシステムを拡張し、ビルド時にモジュール境界を強制します。
- JEP 220: モジュラーランタイムイメージ: モジュールを収容し、パフォーマンス、セキュリティ、保守性を向上させるために、JDK および JRE ランタイムイメージを再構築します。
- JEP 261: モジュールシステム: Java プラットフォームモジュールシステムの実装
- JEP 282: Javaリンカー: モジュールとその依存関係のセットをカスタムランタイムイメージに組み立てて最適化できるツールを作成する[ 7 ]
- JSR 376: Javaプラットフォームモジュールシステム[ 8 ]
さらに、モジュール システムへの移行を容易にするために、JDK 9 の他のいくつかの機能も追加されました。
- JEP 238: マルチリリースJARファイル: JARファイル形式を拡張して、Javaリリース固有の複数のバージョンのクラスファイルを単一のアーカイブに共存させます。[ 9 ]
- JEP 253: JavaFX UIコントロールとCSS APIのモジュール化の準備: 現在は内部API経由でのみ利用可能で、モジュール化によってアクセスできなくなるJavaFX機能用のパブリックAPIを定義します。[ 10 ]
- JEP 260: ほとんどの内部APIをカプセル化する: JDKの内部APIの大部分はデフォルトでアクセスできないようにしますが、広く使用されている重要な内部APIのいくつかは、その機能のすべてまたはほとんどに対してサポートされている代替手段が存在するまでアクセス可能なままにします。[ 11 ]
- JEP 275: モジュラーJavaアプリケーションパッケージング: JavaパッケージャーはJDK 9で進化し、モジュールを認識できるようになり、例えば、モジュールとそれが依存するすべてのモジュールをパッケージ化できるようになります。[ 12 ]
モジュールのプロパティ
モジュールはパッケージをグループ化し、公開APIに属するパッケージを厳密に制御するために使用されます。JARファイルとは異なり、モジュールは依存するモジュールとエクスポートするパッケージを明示的に宣言します。[ 13 ]明示的な依存関係宣言は、大規模なアプリケーションやソフトウェアコンポーネント間の依存関係の理解を容易にし、コードの整合性を向上させます。
モジュール宣言は、モジュールのソースファイル階層のルートにある module-info.javaというファイルに配置されます。JDK は、コンパイル時と実行時の両方で、モジュール間の依存関係と相互作用を検証します。
たとえば、次のモジュール宣言は、モジュールがcom.foo.bar別のモジュールに依存していることを宣言しcom.foo.baz、次のパッケージをエクスポートします。com.foo.bar.alphaおよびcom.foo.bar.beta:
モジュールcom.foo.bar { com.foo.bazが必要です; com.foo.bar.alpha をエクスポートします。 com.foo.bar.betaをエクスポートします。 } com.foo.bar.alphaパッケージとパッケージのパブリックメンバーは、依存モジュールからアクセス可能です。プライベートメンバーは、リフレクションcom.foo.bar.betaなどの手段を用いてもアクセスできません。なお、Javaバージョン9から16では、このような「不正アクセス」が事実上許可されるかどうかは、コマンドライン設定によって決まります。[ 14 ]
JDK自体はJava 9でモジュール化されています。[ 15 ]たとえば、Java標準ライブラリの大部分はモジュールによってエクスポートされていますjava.base。
Java 25以降では、モジュール自体をインポートできるようになり、エクスポートされたパッケージもすべて自動的にインポートされるようになりました。[ 16 ]これは を使って行われますimport module。例えば、は以下と同等です。 importmodulejava.sql;
import java.sql.* ; import javax.sql.* ; // java.logging、java.transaction.xa、java.xml からの残りの間接エクスポート同様に、 は に属する 54 個のパッケージすべてをインポートします。 importmodulejava.base;java.base
パッケージorg.wikipedia.examples ;モジュールjava.baseをインポートします。/** * モジュール java.base をインポートすると、ほとんどのクラスを手動でインポートする必要がなくなります。 * 以下のクラス (java.lang 外部) が使用されます。* - java.text.MessageFormat * - java.util.Date * - java.util.List * - java.util.concurrent.ThreadLocalRandom */ public class Example { public static void main ( String [] args ) { List < String > colours = List . of ( "Red" , " Orange " , "Yellow" , "Green" , "Blue" , "Indigo" , "Violet" ); IO . println ( MessageFormat . format ( "My favourite colour is {0} and today is {1,date,long}" , colours . get ( ThreadLocalRandom . current (). nextInt ( colours . size ())), new Date () )); } }モジュールは次のキーワードを使用します。
exports: モジュール宣言で、他のモジュールで利用可能なパッケージを指定するために使用されます。module: モジュールを宣言するopen: パッケージ内のすべてのクラスが他のモジュールからリフレクションを介してアクセスできることを示しますopens: 特定のパッケージを他のモジュールに反映するために開くために使用されますprovides: モジュールがサービスインターフェースの実装を提供することを宣言するために使用されますrequires: モジュール宣言で使用され、モジュールが別のモジュールに依存することを指定します。to:opensディレクティブとともに使用して、どのモジュールがパッケージに反射的にアクセスできるかを指定します。transitive: ディレクティブとともに使用されrequires、モジュールが別のモジュールを必要とするだけでなく、そのモジュールに依存するモジュールがそのモジュールの依存関係を利用できるようにすることを示します。uses: モジュール内で、モジュールがサービスを使用していることを宣言するために使用されます (つまり、他のモジュールによって提供されるサービスを利用します)with:providesディレクティブとともに使用して、モジュールによって提供されるサービスの実装を指定します。
標準モジュール
コアモジュール
名前空間の下にあるモジュールはJava Platform, Standard Editionjava.*に属し、名前空間の下にあるモジュールはJava Development Kitに属します。[ 17 ]jdk.*
| 名前 | 説明 |
|---|---|
java.base | Java SE プラットフォームの基盤となるコア API を定義します。
|
java.compiler | 言語モデル、Java アノテーション処理、Java コンパイラに関連する API を定義します。 |
java.datatransfer | アプリケーション間またはアプリケーション内のデータ転送を容易にする API を定義します。 |
java.desktop | ユーザー インターフェイス用のAbstract Window Toolkit (AWT) およびSwingライブラリ、およびアクセシビリティ、オーディオ、イメージング、印刷、JavaBeans用の APIを定義します。 |
java.instrument | Java 仮想マシン(JVM)上で実行されるプログラムのインストルメンテーションを可能にするサービスを定義します。 |
java.logging | Java アプリケーションでイベントをログに記録するための API (Java Logging API) を定義します。 |
java.management | Java Management Extensions (JMX) フレームワークの API を定義します。 |
java.management.rmi | Java Management Extensions (JMX) リモート API の リモート メソッド呼び出し(RMI) コネクタを定義します。 |
java.naming | Java Naming and Directory Interface (JNDI) サービス の API を定義します。 |
java.net.http | HTTP クライアントおよびWebSocket機能の API を定義します。 |
java.prefs | ユーザー設定を管理および保存するための API を定義します。 |
java.rmi | Java 仮想マシン間のオブジェクト通信用のリモート メソッド呼び出し (RMI) API を定義します。 |
java.scripting | スクリプト エンジンをJava アプリケーションに統合するための API (スクリプト API) を定義します。 |
java.se | Java SE プラットフォームの標準 API を定義します。 |
java.security.jgss | セキュリティ コンテキストの IETF Generic Security Services API (GSS-API)の Java バインディングを定義します。 |
java.security.sasl | Java のSASL ( Simple Authentication and Security Layer ) プロトコルのサポートを定義します。 |
java.smartcardio | スマート カードデバイスと対話するための API (Java Smart Card I/O API) を定義します。 |
java.sql | データベースとの対話のためのJava Database Connectivity (JDBC) API を定義します。 |
java.sql.rowset | Java で表形式データを管理および操作するための JDBC RowSet API を定義します。 |
java.transaction.xa | JDBC 内で分散トランザクションを管理するための API を定義します。 |
java.xml | XML データの解析と変換のためのツールを含む、 Java API for XML Processing (JAXP)を定義します。 |
java.xml.crypto | XML データを使用した 暗号化操作用の API を定義します。 |
jdk.accessibility | JDK で 支援技術を実装するためのユーティリティ クラスを定義します。 |
jdk.attach | 実行中の JVM インスタンスに接続して対話するためのアタッチ API (アタッチ API) を定義します。 |
jdk.charsets | には含まれていない、2 バイト文字セットや IBM 固有の文字セットなどの追加の文字セット( charset ) を提供します。 java.base |
jdk.compiler | Java コンパイラとコマンドライン ツールjavacの内部実装を定義します。 |
jdk.crypto.cryptoki | 暗号化操作用の SunPKCS11 セキュリティ プロバイダの実装を定義します。 |
jdk.dynalink | オブジェクトに対する高レベルの操作を動的にリンクするための API を定義します。 |
jdk.editpad | コードを評価するために使用される編集パッド サービスを実装しますjdk.jshell。 |
jdk.hotspot.agent | HotSpot Serviceability Agentの実装を提供します。 |
jdk.httpserver | 単純な HTTP サーバーを実行するためのJDK 固有の HTTP サーバー API とjwebserverツールを定義します。 |
jdk.incubator.vector | AVX や NEON 命令など、実行時に SIMD 命令にコンパイルできる計算を表現するための API を定義します。 |
jdk.jartool | jar コマンドやjarsignerコマンド などのJava Archive (JAR) ファイルを操作するためのツールを提供します。 |
jdk.javadoc | システム ドキュメント ツールの実装とそのコマンド ライン バージョンであるjavadocを定義します。 |
jdk.jcmd | jcmd、jps、jstatなどの JVM プロセスの診断とトラブルシューティングのためのツールを定義します。 |
jdk.jconsole | Java アプリケーションを監視および管理するための JMX ベースのグラフィカル ツールjconsoleを定義します。 |
jdk.jdeps | jdeps、javap、jdeprscan、jnativescanなど、Java プログラムおよびライブラリ内の依存関係を分析するためのツールを定義します。 |
jdk.jdi | Java アプリケーションをデバッグするためのJava デバッグ インターフェイス(JDI)を定義します。 |
jdk.jdwp.agent | リモート デバッグ用のJava Debug Wire Protocol (JDWP) エージェントの実装を提供します。 |
jdk.jfr | パフォーマンスおよび診断データを収集するための JDK Flight Recorder (JFR)の API を定義します。 |
jdk.jlink | カスタム ランタイム イメージを作成するためのjlinkツールと、 JMOD および JDK コンテナー ファイルを管理するためのjmodおよびjimageツールを定義します。 |
jdk.jpackage | プラットフォーム固有のアプリケーション パッケージを作成するための Java パッケージツール ( jpackage )を定義します。 |
jdk.jshell | Java コード スニペットを対話的に評価するための jshellツールを提供します。 |
jdk.jsobject | Java アプリケーションに JavaScriptオブジェクトを統合するための API を定義します。 |
jdk.jstatd | JVM 統計をリモートで監視するための jstatdツールを定義します。 |
jdk.localedata | 米国以外のロケールにロケール固有のデータを提供します。 |
jdk.management | JVM の監視と制御のための JDK 固有の管理インターフェースを定義します。 |
jdk.management.agent | JVM の JMX ベースの管理エージェントを定義します。 |
jdk.management.jfr | JDK Flight Recorder (JFR) の管理インターフェイスを定義します。 |
jdk.naming.dns | ドメイン名を解決するためのDNS Java 命名プロバイダー を実装します。 |
jdk.naming.rmi | リモート メソッド呼び出し用の RMI Java ネーミング プロバイダーを実装します。 |
jdk.net | ネットワーク プログラミング用の JDK 固有の API を定義します。 |
jdk.nio.mapmode | JDK で使用可能な特定のファイル マッピング モードを定義します。 |
jdk.sctp | JDK で ストリーム制御伝送プロトコル(SCTP)用の API を提供します。 |
jdk.security.auth | パッケージ内の認証モジュールとセキュリティ関連のインターフェースを実装しますjavax.security.auth( 内のインターフェースjavax.security.auth.*)。 |
jdk.security.jgss | GSS-API の拡張と、JDK での SASL GSSAPI メカニズムの実装を定義します。 |
jdk.xml.dom | Java SE でカバーされていないWorld Wide Web Consortium (W3C)ドキュメント オブジェクト モデル(DOM) APIの JDK サブセットを定義します。java名前空間の外部 ( からorg.w3c.dom) にパッケージをエクスポートします。 |
jdk.zipfs | ZIP ファイル システム プロバイダーの実装を提供し、ZIP ファイルにファイル システムとしてアクセスできるようにします。 |
モジュールはjdk.unsupported公式のモジュールではありませんが、JDKにバンドルされていることが多く、Java標準ライブラリの実装の詳細を表しています。[ 18 ]sun.*名前空間(sun.misc.UnsafeCPUやハードウェアの操作、メモリの直接管理などに使用されるクラスを含む)内のパッケージ[ 19 ]とパッケージが含まれていcom.sun.*ます。
モジュールjdk . unsupported {エクスポートsun . misc ;エクスポートsun . reflect ;エクスポートcom . sun . nio . file ;sun . miscを開きます; sun . reflect を開きます; }以前は Java 標準ライブラリの一部であった Jakarta EEはモジュール化されていませんが、ビルド システムは自動モジュールを生成できます。
JavaFXモジュール
JavaFXは以前はコアJDKにバンドルされていましたが、Java 11でOpenJFXに分割されました。JavaFXは以下のモジュールに分割されています。[ 20 ]
| 名前 | 説明 |
|---|---|
javafx.base | JavaFX UI ツールキットのコア API (バインディング、プロパティ、コレクション、イベントの API など) を定義します。 |
javafx.controls | JavaFX UI ツールキットの UI コントロール、チャート、スキンの API を定義します。 |
javafx.fxml | JavaFX UI ツールキットの FXML API を定義します。 |
javafx.graphics | JavaFX UI ツールキットのシーングラフ、アニメーション、ジオメトリ、およびその他の関連 API を定義します。 |
javafx.media | JavaFX UI ツールキットのメディア再生およびオーディオ コンテンツ API を定義します。 |
javafx.swing | JavaFX UI ツールキットの JavaFX/ Swing相互運用サポート API を定義します。 |
javafx.web | JavaFX UI ツールキットの WebView API を定義します。 |
jdk.jsobject | JavaScriptオブジェクトの API を定義します。 |
jfx.incubator.input | JavaFX コントロールをカスタマイズするためのメカニズムをインキュベートします。 |
jfx.incubator.richtext | JavaFX 用の RichTextArea コントロールをインキュベートします。 |
OSGiとのリンク
Javaモジュールシステムは、 OSGiプラットフォームが現在サポートしているすべての機能(例えば、ライフサイクルモデルやサービスレジストリなど)をサポートすることを意図しているわけではありません。しかし、Javaモジュールシステムは、コンパイル時のモジュール化やネイティブライブラリの組み込みサポートなど、OSGiではサポートされていない機能をサポートする予定です。[ 21 ] 2016年には、JavaモジュールシステムとOSGiの相互運用性について検討した記事がいくつか公開されました。これらの記事はInfoQ [ 22 ]とOSGi Alliance Blog [ 23 ]でご覧いただけます。
参照
参考文献
- ^ 「Java Platform Module System (JSR 376)」 . Oracle Corporation . 2018年7月2日閲覧。
- ^ a b「Project Jigsaw」 . Oracle Corporation . 2015年11月29日閲覧。
- ^ Mark Reinhold (2009年9月20日). 「It's time for … Plan B」 . Oracle Corporation . 2017年6月21日閲覧。
- ^ "JDK 9" . Oracle Corporation . 2016年2月24日閲覧。
- ^ 「Java 9モジュールについて:その概要と使用方法」 Oracle Corporation。2022年8月14日時点のオリジナルよりアーカイブ。2025年12月8日閲覧。
- ^ 「Java 9:リリース日と新機能」 techworld.com、2017年7月21日。 2017年11月18日閲覧。
- ^ 「jlink: Javaリンカー(JSR 282)」Oracle Corporation . 2016年3月12日閲覧。
- ^ 「Java Platform Module System (JSR 376)」 . Oracle Corporation . 2015年11月29日閲覧。
- ^ 「JEP 238: マルチリリースJARファイル」 . Oracle Corporation . 2017年7月31日閲覧。
- ^ 「JEP 253: JavaFX UIコントロールとCSS APIのモジュール化の準備」 Oracle Corporation . 2017年7月31日閲覧。
- ^ 「JEP 260: ほとんどの内部APIをカプセル化する」 Oracle Corporation . 2017年7月31日閲覧。
- ^ 「JEP 275: モジュラーJavaアプリケーションパッケージング」 Oracle Corporation . 2017年7月31日閲覧。
- ^ Mark Reinhold (2016年3月8日). 「モジュールシステムの現状」 . Oracle Corporation . 2017年2月18日閲覧。
- ^ 「JEP 396: デフォルトでJDK内部を強力にカプセル化する」 。 2021年2月6日閲覧。
- ^ 「JDKモジュールの概要」 . Oracle Corporation . 2016年6月24日. 2015年12月8日時点のオリジナルよりアーカイブ。2017年2月18日閲覧。
- ^ 「JEP 494: モジュールのインポート宣言(第2プレビュー)」。openjdk.org。
- ^ 「Java® プラットフォーム、Standard Edition および Java 開発キット バージョン 24 API 仕様」。docs.oracle.com 。
- ^ "jdk.unsupported" . cr.openjdk.org . OpenJDK . 2025年10月10日閲覧。
- ^ Ben Evans (2020年5月4日). 「The Unsafe Class: Unsafe at Any Speed」 . blogs.oracle.com . Oracle Corporation.
- ^ 「概要 (JavaFX)」 . openjfx.io .
- ^ Mark Reinhold (2012年8月24日). 「Project Jigsaw: 電車に乗り遅れた場合のQ&A」 . Oracle Corporation . 2015年11月29日閲覧。
- ^ 「Java 9、OSGi、そしてモジュール性の未来」 InfoQ 2016年9月26日閲覧。
- ^ 「JavaモジュールレイヤーとOSGiバンドル」 . OSGi Alliance . 2016年8月1日閲覧。