Javaプラットフォームモジュールシステム

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モジュールシステムには、以下のJEPJSR(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.baseJava SE プラットフォームの基盤となるコア API を定義します。

requiresすべてのモジュールで暗黙的に必要とされ、モジュール宣言内 で宣言する必要はありません。

java.compiler言語モデル、Java アノテーション処理、Java コンパイラに関連する API を定義します。
java.datatransferアプリケーション間またはアプリケーション内のデータ転送を容易にする API を定義します。
java.desktopユーザー インターフェイス用のAbstract Window Toolkit (AWT) およびSwingライブラリ、およびアクセシビリティ、オーディオ、イメージング、印刷、JavaBeans用の APIを定義します。
java.instrumentJava 仮想マシン(JVM)上で実行されるプログラムのインストルメンテーションを可能にするサービスを定義します。
java.loggingJava アプリケーションでイベントをログに記録するための API (Java Logging API) を定義します。
java.managementJava Management Extensions (JMX) フレームワークの API を定義します。
java.management.rmiJava Management Extensions (JMX) リモート API の リモート メソッド呼び出し(RMI) コネクタを定義します。
java.namingJava Naming and Directory Interface (JNDI) サービス の API を定義します。
java.net.httpHTTP クライアントおよびWebSocket機能の API を定義します。
java.prefsユーザー設定を管理および保存するための API を定義します。
java.rmiJava 仮想マシン間のオブジェクト通信用のリモート メソッド呼び出し (RMI) API を定義します。
java.scriptingスクリプト エンジンをJava アプリケーションに統合するための API (スクリプト API) を定義します。
java.seJava SE プラットフォームの標準 API を定義します。
java.security.jgssセキュリティ コンテキストの IETF Generic Security Services API (GSS-API)の Java バインディングを定義します。
java.security.saslJava のSASL ( Simple Authentication and Security Layer ) プロトコルのサポートを定義します。
java.smartcardioスマート カードデバイスと対話するための API (Java Smart Card I/O API) を定義します。
java.sqlデータベースとの対話のためのJava Database Connectivity (JDBC) API を定義します。
java.sql.rowsetJava で表形式データを管理および操作するための JDBC RowSet API を定義します。
java.transaction.xaJDBC 内で分散トランザクションを管理するための API を定義します。
java.xmlXML データの解析と変換のためのツールを含む、 Java API for XML Processing (JAXP)を定義します。
java.xml.cryptoXML データを使用した 暗号化操作用の API を定義します。
jdk.accessibilityJDK で 支援技術を実装するためのユーティリティ クラスを定義します。
jdk.attach実行中の JVM インスタンスに接続して対話するためのアタッチ API (アタッチ API) を定義します。
jdk.charsetsには含まれていない、2 バイト文字セットや IBM 固有の文字セットなどの追加の文字セット( charset ) を提供します。 java.base
jdk.compilerJava コンパイラとコマンドライン ツールjavacの内部実装を定義します。
jdk.crypto.cryptoki暗号化操作用の SunPKCS11 セキュリティ プロバイダの実装を定義します。
jdk.dynalinkオブジェクトに対する高レベルの操作を動的にリンクするための API を定義します。
jdk.editpadコードを評価するために使用される編集パッド サービスを実装しますjdk.jshell
jdk.hotspot.agentHotSpot Serviceability Agentの実装を提供します。
jdk.httpserver単純な HTTP サーバーを実行するためのJDK 固有の HTTP サーバー API とjwebserverツールを定義します。
jdk.incubator.vectorAVX や NEON 命令など、実行時に SIMD 命令にコンパイルできる計算を表現するための API を定義します。
jdk.jartooljar コマンドjarsignerコマンド などのJava Archive (JAR) ファイルを操作するためのツールを提供します。
jdk.javadocシステム ドキュメント ツールの実装とそのコマンド ライン バージョンであるjavadocを定義します。
jdk.jcmdjcmdjpsjstatなどの JVM プロセスの診断とトラブルシューティングのためのツールを定義します。
jdk.jconsoleJava アプリケーションを監視および管理するための JMX ベースのグラフィカル ツールjconsoleを定義します。
jdk.jdepsjdepsjavapjdeprscanjnativescanなど、Java プログラムおよびライブラリ内の依存関係を分析するためのツールを定義します。
jdk.jdiJava アプリケーションをデバッグするための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.jshellJava コード スニペットを対話的に評価するための jshellツールを提供します。
jdk.jsobjectJava アプリケーションに JavaScriptオブジェクトを統合するための API を定義します。
jdk.jstatdJVM 統計をリモートで監視するための jstatdツールを定義します。
jdk.localedata米国以外のロケールにロケール固有のデータを提供します。
jdk.managementJVM の監視と制御のための JDK 固有の管理インターフェースを定義します。
jdk.management.agentJVM の JMX ベースの管理エージェントを定義します。
jdk.management.jfrJDK Flight Recorder (JFR) の管理インターフェイスを定義します。
jdk.naming.dnsドメイン名を解決するためのDNS Java 命名プロバイダー を実装します。
jdk.naming.rmiリモート メソッド呼び出し用の RMI Java ネーミング プロバイダーを実装します。
jdk.netネットワーク プログラミング用の JDK 固有の API を定義します。
jdk.nio.mapmodeJDK で使用可能な特定のファイル マッピング モードを定義します。
jdk.sctpJDK で ストリーム制御伝送プロトコル(SCTP)用の API を提供します。
jdk.security.authパッケージ内の認証モジュールとセキュリティ関連のインターフェースを実装しますjavax.security.auth( 内のインターフェースjavax.security.auth.*)。
jdk.security.jgssGSS-API の拡張と、JDK での SASL GSSAPI メカニズムの実装を定義します。
jdk.xml.domJava SE でカバーされていないWorld Wide Web Consortium (W3C)ドキュメント オブジェクト モデル(DOM) APIの JDK サブセットを定義します。java名前空間の外部 ( からorg.w3c.dom) にパッケージをエクスポートします。
jdk.zipfsZIP ファイル システム プロバイダーの実装を提供し、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.baseJavaFX UI ツールキットのコア API (バインディング、プロパティ、コレクション、イベントの API など) を定義します。
javafx.controlsJavaFX UI ツールキットの UI コントロール、チャート、スキンの API を定義します。
javafx.fxmlJavaFX UI ツールキットの FXML API を定義します。
javafx.graphicsJavaFX UI ツールキットのシーングラフ、アニメーション、ジオメトリ、およびその他の関連 API を定義します。
javafx.mediaJavaFX UI ツールキットのメディア再生およびオーディオ コンテンツ API を定義します。
javafx.swingJavaFX UI ツールキットの JavaFX/ Swing相互運用サポート API を定義します。
javafx.webJavaFX UI ツールキットの WebView API を定義します。
jdk.jsobjectJavaScriptオブジェクトの API を定義します。
jfx.incubator.inputJavaFX コントロールをカスタマイズするためのメカニズムをインキュベートします。
jfx.incubator.richtextJavaFX 用の RichTextArea コントロールをインキュベートします。

Javaモジュールシステムは、 OSGiプラットフォームが現在サポートしているすべての機能(例えば、ライフサイクルモデルやサービスレジストリなど)をサポートすることを意図しているわけではありません。しかし、Javaモジュールシステムは、コンパイル時のモジュール化やネイティブライブラリの組み込みサポートなど、OSGiではサポートされていない機能をサポートする予定です。[ 21 ] 2016年には、JavaモジュールシステムとOSGiの相互運用性について検討した記事がいくつか公開されました。これらの記事はInfoQ [ 22 ]とOSGi Alliance Blog [ 23 ]でご覧いただけます。

参照

参考文献

  1. ^ 「Java Platform Module System (JSR 376)」 . Oracle Corporation . 2018年7月2日閲覧。
  2. ^ a b「Project Jigsaw」 . Oracle Corporation . 2015年11月29日閲覧。
  3. ^ Mark Reinhold (2009年9月20日). 「It's time for … Plan B」 . Oracle Corporation . 2017年6月21日閲覧
  4. ^ "JDK 9" . Oracle Corporation . 2016年2月24日閲覧。
  5. ^ 「Java 9モジュールについて:その概要と使用方法」 Oracle Corporation。2022年8月14日時点のオリジナルよりアーカイブ2025年12月8日閲覧。
  6. ^ 「Java 9:リリース日と新機能」 techworld.com、2017年7月21日。 2017年11月18日閲覧
  7. ^ 「jlink: Javaリンカー(JSR 282)」Oracle Corporation . 2016年3月12日閲覧
  8. ^ 「Java Platform Module System (JSR 376)」 . Oracle Corporation . 2015年11月29日閲覧。
  9. ^ 「JEP 238: マルチリリースJARファイル」 . Oracle Corporation . 2017年7月31日閲覧。
  10. ^ 「JEP 253: JavaFX UIコントロールとCSS APIのモジュール化の準備」 Oracle Corporation . 2017年7月31日閲覧
  11. ^ 「JEP 260: ほとんどの内部APIをカプセル化する」 Oracle Corporation . 2017年7月31日閲覧。
  12. ^ 「JEP 275: モジュラーJavaアプリケーションパッケージング」 Oracle Corporation . 2017年7月31日閲覧。
  13. ^ Mark Reinhold (2016年3月8日). 「モジュールシステムの現状」 . Oracle Corporation . 2017年2月18日閲覧
  14. ^ 「JEP 396: デフォルトでJDK内部を強力にカプセル化する」 。 2021年2月6日閲覧
  15. ^ 「JDKモジュールの概要」 . Oracle Corporation . 2016年6月24日. 2015年12月8日時点のオリジナルよりアーカイブ2017年2月18日閲覧。
  16. ^ 「JEP 494: モジュールのインポート宣言(第2プレビュー)」openjdk.org
  17. ^ 「Java® プラットフォーム、Standard Edition および Java 開発キット バージョン 24 API 仕様。docs.oracle.com
  18. ^ "jdk.unsupported" . cr.openjdk.org . OpenJDK . 2025年10月10日閲覧
  19. ^ Ben Evans (2020年5月4日). 「The Unsafe Class: Unsafe at Any Speed」 . blogs.oracle.com . Oracle Corporation.
  20. ^ 「概要 (JavaFX)」 . openjfx.io .
  21. ^ Mark Reinhold (2012年8月24日). 「Project Jigsaw: 電車に乗り遅れた場合のQ&A」 . Oracle Corporation . 2015年11月29日閲覧
  22. ^ 「Java 9、OSGi、そしてモジュール性の未来」 InfoQ 2016年9月26日閲覧
  23. ^ 「JavaモジュールレイヤーとOSGiバンドル」 . OSGi Alliance . 2016年8月1日閲覧。