Java 9モジュールは、Javaの構造における最大の変更の一つです。ここでは、「Java 9モジュールシステム」について簡単な高レベルの紹介をします。
Java 9モジュール
Java 9モジュールシステムに関して以下のトピックを見ていきます。
- 紹介
- Java SE 9: Jigsawプロジェクト
- 現行のJavaシステムの問題点
- Java SE 9モジュールシステムの利点
- JDK 8とJDK 9の比較
- Java 9モジュールとは何か
- Java 9モジュールシステムの元祖
- Java 8とJava 9のアプリケーションの比較
紹介
Oracle社は、Java 9のリリースを2017年3月から2017年9月に延期しました。Java SE 8には3つの大きな新機能(およびいくつかの追加機能と改善)が含まれていました。
- ラムダ式
- ストリームAPI
- 日付API
同様に、Java SE 9には3つの大きな機能(およびいくつかの追加機能と改善)が含まれています:
- Javaモジュールシステム(Jigsawプロジェクト)
- Java REPL
- Milling Project Coin
In this post, we will discuss Oracle Jigsaw project basics.
Java SE 9: Jigsaw Project
Jigsawプロジェクトは、Java SE 9の完全に新しいコンセプト、Java Module Systemを紹介する予定です。これは、Oracle CorpによるJava SE 9リリースでの非常に大きな、名声あるプロジェクトです。最初はJava SE 7リリースの一環としてこのプロジェクトを開始しましたが、大きな変更があり、Java SE 8に延期されました。その後、再び延期されました。現在、Java SE 9と共に2017年9月にリリースされる予定です。Jigsawプロジェクトの主な目標:
- モジュラーJDK
現在のJDKシステムは非常に大きいため、JDK自体を小さなモジュールに分割してさまざまな利点を得ることにしました(これらについては後のセクションで詳しく説明します)。- モジュラーソースコード
現在のソースコードのjarファイルは非常に大きく、特にrt.jarは非常に大きいです。そのため、Javaのソースコードをより小さなモジュールに分割する予定です。- モジュラーなランタイムイメージ
この機能の主な目標は、「JDKおよびJREのランタイムイメージをモジュールに適応すること」です。- 多くの内部APIをカプセル化
この機能の主な目標は、「JDKのほとんどの内部APIをデフォルトでアクセスできないようにするが、一部の重要な広く使用される内部APIはアクセス可能にすること」です。- Javaプラットフォームモジュールシステム
この機能の主な目標は、「ユーザーが自分のモジュールを作成してアプリケーションを開発できるようにすること」です。- jlink:Javaリンカー
このjlinkツールの主な目標は、「ユーザーが自分のアプリケーションに実行可能なファイルを作成できるようにすること」です。
これらのことがよく理解できない場合でも心配しないでください。後のセクションや私の次の投稿で、これらの概念を具体的な例を用いて詳しく説明します。
現在のJavaシステムの問題点
このセクションでは、「なぜJava SE 9モジュールシステムが必要なのか」について議論します。これは、現在のJavaシステムの問題を意味します。Java SE 8またはそれ以前のシステムには、次のような問題があります。開発や配信中にJavaベースのアプリケーションを開発する上で以下のような問題があります。
- JDKが大きすぎるため、小さなデバイスにスケールダウンするのは少し難しいです。Java SE 8では、この問題を解決するために3種類のコンパクトプロファイル(compact1、compact2、compact3)が導入されました。しかし、これはこの問題を解決しません。
- rt.jarなどのJARファイルは、小さなデバイスやアプリケーションで使用するには大きすぎます。
- JDKが大きすぎるため、アプリケーションやデバイスがより良いパフォーマンスをサポートすることができません。
- 現在のJavaシステムには強いカプセル化がないため、「public」アクセス修飾子があまりにもオープンです。誰でもアクセスできます。
- JDKやJREが大きすぎるため、アプリケーションのテストやメンテナンスが難しくなります。
- 公開があまりにもオープンなため、一部の内部の非クリティカルAPI(sun.*、*.internal.*など)にアクセスを避けることができません。
- ユーザーが内部APIにアクセスできるため、セキュリティも大きな問題です。
- アプリケーションが大きすぎます。
- コンポーネント間の疎結合をサポートするのは少し難しいです。
これらすべての問題を解決するために、Oracle CorpはJava SE 9リリースでJavaモジュールシステムをリリースする予定です。
Java SE 9モジュールシステムの利点
Java SE 9モジュールシステムは以下の利点を提供します。
- Java SE 9はJDK、JRE、JARなどを小さなモジュールに分割するため、必要なモジュールのみを使用できます。そのため、Javaアプリケーションを小型デバイスに縮小するのは非常に簡単です。
- テストと保守の容易さ。
- より良いパフォーマンスのサポート。
- 公開が単なる公開ではなく、非常に強力なカプセル化をサポートしています(大きな概念ですが、すぐにいくつかの有用な例で探求します)。
- 内部の非クリティカルAPIにアクセスできなくなりました。
- モジュールは不要な内部の詳細を安全に非表示にでき、より良いセキュリティを提供します。
- アプリケーションは必要なモジュールのみを使用するため、非常に小さくなります。
- コンポーネント間の結合を少なくサポートするのは簡単です。
- 単一責任の原則(SRP)をサポートするのは簡単です。
これらの概念を順次探求していきます。
JDK 8とJDK 9の比較
私たちはJDKソフトウェアが含まれるものを知っています。JDK 8ソフトウェアをインストールすると、Java Homeフォルダ内にbin、jre、libなどのディレクトリがいくつか表示されます。ただし、Oracle Corpはこのフォルダ構造を以下のように少し異なる方法で変更しました。 JDK 8フォルダ構造:
JDK 9フォルダ構造:
ここで、JDK 9にはJREが含まれていません。JDK 9では、JREは別の配布フォルダに分離されています。JDK 9ソフトウェアには新しいフォルダ「jmods」が含まれています。以下に示すように、Java 9モジュールのセットが含まれています。 JDK 9では、rt.jarとtools.jarはありません
注意: 本日時点で、「jmods」には95のモジュールが含まれています。最終リリースでは増える可能性があります。「jmods」フォルダは${JAVA_HOME}/jmodsにあります。これらはJDKモジュールとして知られています。
Java 9モジュールとは何ですか?
A Module is a self-describing collection of Code, Data, and some Resources. It is a set of related Packages, Types (classes, abstract classes, interfaces etc) with Code & Data and Resources. Each Module contains only a set of related code and data to support Single Responsibility (Functionality) Principle (SRP). The main goal of Java 9 Module System is to support Modular Programming in Java. We will discuss on “What is a Module Descriptor” and “How to develop Java Modules” in my coming posts.
Java 9モジュールシステムの基盤
現在、Java 9のモジュールシステムには、アーリーアクセスJDKに95のモジュールがあります。Oracle Corpは、JDKのjarファイルとJava SEの仕様を2つのモジュールセットに分けています。
- すべてのJDKモジュールは「jdk.*」で始まります。
- すべてのJava SEの仕様モジュールは「java.*」で始まります。
Java 9のモジュールシステムには、「java.base」モジュールがあります。これはベースモジュールとして知られています。これは独立したモジュールであり、他のモジュールに依存しません。デフォルトでは、他のすべてのモジュールはこのモジュールに依存します。そのため、「java.base」モジュールはJava 9モジュールの母とも呼ばれています。これはすべてのJDKモジュールとユーザー定義モジュールのデフォルトモジュールです。
Java 8とJava 9のアプリケーションを比較する
私たちはすでにJava 5、6、7、または8を使用して多くのJavaアプリケーションを開発しています。 Java 8またはそれ以前のアプリケーションの外観と内容を知っています。要するに、私は以下に示すような図でJava 8アプリケーションを表現しました:Java 8またはそれ以前のアプリケーションでは、トップレベルのコンポーネントとしてパッケージがあります。これは関連する型をグループ化します。また、一連のリソースも含まれます。 Java 9アプリケーションはこれと大きな違いはありません。関連するパッケージのセットをグループ化するために使用される新しいコンポーネント「モジュール」が導入されました。そして、もう1つの新しいコンポーネントがモジュール記述子(「module-info.java」)です。それだけです。アプリケーションの残りは、以下に示すような以前のバージョンのアプリケーションと同じです。
Java 8アプリケーションがトップレベルのコンポーネントとしてパッケージを持っているのと同様に、Java 9アプリケーションはモジュールをトップレベルのコンポーネントとして持っています。注:-各Java 9モジュールには1つのモジュールと1つのモジュール記述子があります。 Java 8パッケージとは異なり、1つのモジュールに複数のモジュールを作成することはできません。要するに、Java 9モジュールには以下の主要なコンポーネントが含まれています:
- モジュール
- モジュール名
- モジュール記述子
- 一連のパッケージ
- 一連の型およびリソース
Source:
https://www.digitalocean.com/community/tutorials/java-9-modules