torutkのブログ

ソフトウェア・エンジニアのブログ

Project Jigsaw ことはじめ(その4)

Project Jigsaw ことはじめ(その3) - torutkのブログ の続きです。

今回は、作成したモジュールを配布するためのパッケージ化(ファイル化)です。

前回作成した2つのモジュール

  • org.example.bravo
  • org.example.delta

を、配布用にファイル化します。

配布用にファイル化するには、d:id:torutk:20120602 の記事で軽く触れたjpkgコマンドを使用します。

まずは、org.example.deltaモジュールから生成します。

$ jpkg -m build/org.example.delta jmod org.example.delta
$ ls
build  lib  org.example.delta@2.0.jmod  src
$

org.example.delta@2.0.jmod ファイルが生成されました。
このファイルを配布し、受領した側でモジュール・ライブラリにインストールします。

$ jmod create -L mylib
$ jmod install -L mylib org.example.delta@2.0.jmod
$ jmod ls -L mylib
org.example.delta@2.0
$

次に、org.example.bravoモジュールから生成します。

$ jpkg -m build/org.example.bravo jmod org.example.bravo
$ ls
build   org.example.delta@2.0.jmod   src
lib     org.example.bravo@1.0.jmod  

org.example.bravo@1.0.jmod ファイルが生成されました。
このファイルを配布し、受領した側でモジュール・ライブラリにインストールします。

$ jmod ls -L mylib
org.example.delta@2.0
$ jmod install -L mylib org.example.bravo@1.0.jmod
org.openjdk.jigsaw.ConfigurationException: org.example.bravo@=1.0:
 Cannot resolve
org.openjdk.jigsaw.cli.Command$Exception: org.openjdk.jigsaw.ConfigurationException:
 org.example.bravo@=1.0: Cannot resolve
  :

おっと、org.example.deltaのバージョン2.0は、org.example.bravoには対応してないので、エラーとなってしまいました。
org.example.deltaのバージョン1.1ソースからビルドして、再度モジュールファイルを生成します。

$ javac -d build -modulepath build -sourcepath src `find src/org.example.delta 
-name *.java`
$ jpkg -m build/org.example.delta jmod org.example.delta
$ ls *jmod
org.example.bravo@1.0.jmod   org.example.delta@1.1.jmod
org.example.delta@2.0.jmod
$

org.example.delta@1.1.jmod ファイルが生成できたので、これを配布し、受領側でモジュール・ライブラリにインストールします。

$ jmod ls -L mylib
org.example.delta@2.0
$ jmod install -L mylib org.example.delta@1.1.jmod
$ jmod ls -L mylib
org.example.delta@1.1
org.example.delta@2.0
$ jmod install -L mylib org.example.bravo@1.0.jmod
$ jmod ls -L mylib
org.example.bravo@1.0
org.example.delta@1.1
org.example.delta@2.0
$

実行してみましょう。

$ java -L mlib -m org.example.bravo
hello Bravo, Hello Delta 1.1
Warning: CLASSPATH environment variable ignored when -m specified

今回はここまでです。