Jigsaw のお勉強 その1

Java

Java SE 9 がリリースされて随分経ちますが Jigsaw は積極的に使ってないのでさっぱり解らないのが現状です。

リリースされる前から注目されていてネット上には記事がちらほら見受けられていました。

それを読んではいたのですが未だに自分でコードを書いたことは無いのでそろそろなんとかしなければいけないと思い、

冷やし中華はじめました!

じゃなくて、Jigsaw はじめました!

とりあえず何から手を付けて良いものか解らないので Project Jigsaw: Module System Quick-Start Guide を読んでみることにしました。

 

Project Jigsaw: Module System Quick-Start Guide

このドキュメントでは、開発者がモジュールを使い始めるための簡単な例をいくつか紹介します。

サンプルコードのファイルパスはスラッシュを使用し、パス区切り子はコロンです。
Microsoft Windowsの開発者は、ファイルパスにバックスラッシュとセミコロンをパス区切り文字として使用する必要があります

  • Greetings
  • Greetings world
  • Multi-module compilation
  • Packaging
  • Missing requires or missing exports
  • Services
  • The linker
  • –patch-module

Greetings

この最初の例はcom.greetingsという名前のモジュールで、単に “Greetings!”を表示します。
モジュールは、モジュール宣言(module-info.java)とメインクラスの2つのソースファイルで構成されています。

慣例により、モジュールのソースコードは、モジュールの名前であるディレクトリにあります。

ソースコードは、次のコマンドでディレクトリmods / com.greetingsにコンパイルされます。

これで、次のコマンドでこの例を実行します。

–module-pathはモジュールパスです。その値はモジュールを含む1つ以上のディレクトリです。 -mオプションは、メインモジュールを指定します。スラッシュの後の値は、モジュール内のメインクラスのクラス名です。

Greetings world

この2番目の例は、モジュール宣言を更新して、org.astroモジュールへの依存関係を宣言します。
モジュールorg.astroはAPIパッケージorg.astroをエクスポートします。

モジュールは一度に1つずつコンパイルされます。
モジュールcom.greetingsをコンパイルするjavacコマンドは、モジュールorg.astroへの参照と、エクスポートされたパッケージの型を解決できるように、モジュールパスを指定します。

この例は、最初の例とまったく同じ方法で実行されます。

Multi-module compilation

前の例では、モジュールcom.greetingsとモジュールorg.astroが別々にコンパイルされていました。 1つのjavacコマンドで複数のモジュールをコンパイルすることもできます

Packaging

これまでの例では、コンパイルされたモジュールの内容がファイルシステム上で展開されています。
移植と配備の目的では、通常、モジュールをモジュラーJARとしてパッケージ化する方が便利です。
モジュラーJARは、トップレベルのディレクトリにmodule-info.classを持つ通常のJARファイルです。
次の例では、org.astro@1.0.jarおよびcom.greetings.jarをmlibディレクトリに作成します。

この例では、モジュールorg.astroは、そのバージョンが1.0であることを示すようにパッケージ化されています。 モジュールcom.greetingsは、メインクラスがcom.greetings.Mainであることを示すようにパッケージ化されています。 メインクラスを指定することなく、モジュールcom.greetingsを実行できるようになりました。

–module-pathの代わりに-pを使用することによって、コマンドラインも短縮されます。

jarツールには多くの新しいオプションがあります(jar -helpを参照)。その1つはモジュラーJARとしてパッケージ化されたモジュールのモジュール宣言を出力することです。

Missing requires or missing exports

ここで、前の例で、com.greetingsモジュール宣言からの要求を誤って省略した場合の動作を見てみましょう。

このモジュール宣言を修正しましたが、別の間違いを導入しました。
今回はorg.astroモジュール宣言からのエクスポートを省略します。

Services

サービスは、サービスコンシューマモジュールとサービスプロバイダモジュールとの間の疎結合を可能にする。

この例には、サービスコンシューマモジュールとサービスプロバイダモジュールがあります。

モジュールcom.socketは、ネットワークソケット用のAPIをエクスポートします。
このパッケージがエクスポートされるように、APIはcom.socketパッケージ内にあります。
APIは、代替実装を可能にするためにプラガブルです。
サービスタイプは同じモジュール内のクラスcom.socket.spi.NetworkSocketProviderであるため、パッケージcom.socket.spiもエクスポートされます。

モジュールorg.fastsocketはサービスプロバイダモジュールです。
com.socket.spi.NetworkSocketProviderの実装を提供します。
パッケージをエクスポートしません。

以下はcom.socketモジュールのソースコードです。

以下はorg.fastsocketモジュールのソースコードです。

簡単にするために、両方のモジュールをまとめてコンパイルします。 実際には、サービスコンシューマモジュールとサービスプロバイダモジュールは、ほぼ常に別々にコンパイルされます。

最後に、モジュールcom.greetingsを変更してAPIを使用します。

最後に実行します。

出力は、サービスプロバイダが見つかったこと、およびNetworkSocketのファクトリとして使用されたことを確認します。

The linker

jlinkはリンカーツールであり、モジュールのセットとそれらの推移的依存とをリンクしてカスタムモジュラーランタイムイメージを作成するために使用することができます(JEP 220を参照)。

このツールでは、現在、モジュールパス上のモジュールをモジュラーJARまたはJMOD形式でパッケージ化する必要があります。
JDKビルドでは、標準およびJDK固有のモジュールをJMOD形式でパッケージ化します。

次の例では、モジュールcom.greetingsとその推移依存を含むランタイムイメージを作成します。

–module-pathの値は、パッケージ化されたモジュールを含むディレクトリのPATHです。Microsoft Windowsでは パスセパレータ ‘:’を ‘;’に置き換えます。

$ JAVA_HOME / jmodsは、java.base.jmodとその他の標準モジュールとJDKモジュールを含むディレクトリです。

モジュールパス上のディレクトリmlibには、モジュールcom.greetingsの成果物が含まれています。

jlinkツールは、生成されたイメージをカスタマイズするための多くの高度なオプションをサポートしています。詳細はjlink –helpを参照してください。

--patch-module

Doug LeaのCVSからjava.util.concurrentクラスをチェックアウトする開発者は、ソースファイルをコンパイルし、それらのクラスを-Xbootclasspath / pでデプロイするために使用されます。

-Xbootclasspath / pが削除された場合、そのモジュールの置き換えは、モジュール内のクラスを上書きするオプション–patch-moduleです。 また、モジュールの内容を増やすために使用することもできます。 –patch-moduleオプションはjavacでもサポートされており、モジュールのようにコードをコンパイルします。

以下は、新しいバージョンのjava.util.concurrent.ConcurrentHashMapをコンパイルし、それを実行時に使用する例です。

More information

The State of the Module System

JEP 261: Module System

Project Jigsaw

Feedback

Please send usage questions and experience reports to the jigsaw-dev list. Specific suggestions about the design of the module system should be sent to the JSR 376 Expert Group’s comments list.

機械翻訳によって日本語化してみました。

この資料が古くてカビが生えてなければいいのですが・・・ とりあえず読んでみました。

Hatena タグ: