5月24日にJavaをテーマにしたカンファレンス「Java Day Tokyo 2016」が開催。
※Java 9は、来年3月にJava 9リリース予定。
■注目の「
Project Jigsaw 」とは?
他のモジュールをどのように使うか、また他のモジュールからどのように使われるかを制御するモジュールを規定
■何が変わるの?(「Project Jigsaw」の思想)
これまではpublicなクラスにしたら全てのクラスからアクセスできてしまっていたが、
意図しないクラスからも自由に呼べてしまっていた。(publicなので当然なんですが)
さらに、Javaのモジュール化が実現すれば、Javaは小さなIoTデバイスから大規模なクラウドまで、これまで以上に活用の幅を広げられるとのこと。
■具体的には?
モジュールという概念を導入することにより「依存関係」「バージョン」「公開範囲」をコントロールしていく。
つまり、今までのpublicクラスは誰からでもアクセス可能だったが、モジュール内のpublicクラスは、公開範囲に対応するクラスからしかアクセスできなくなるようになるらしい。
■実践
ふーん(?)という感じですが、作成~実行までの流れは以下のような感じ。
※ソースは、
クイックスタート より引用
1.ソースの準備
①org.astro/module-info.java ←呼び出される側のソースのモジュール定義
②org.astro/org/astro/World.java ←呼び出される側のソース(製品などのモジュールだと思ってくれればOK)
③com.greetings/module-info.java ←呼び出す側のソースのモジュール定義
④com.greetings/com/greetings/Main.java ←呼び出す側のソース(自分たちが作成するサービスだと思ってくれればOK)
④は②に依存している関係
===== ①org.astro/module-info.java =====
module org.astro {
exports org.astro;
}
===== ②org.astro/org/astro/World.java =====
package org.astro;
public class World {
public static String name() {
return "world";
}
}
===== ③com.greetings/module-info.java =====
module com.greetings {
requires org.astro;
}
===== ④com.greetings/com/greetings/Main.java =====
package com.greetings;
import org.astro.World;
public class Main {
public static void main(String[] args) {
System.out.format("Greetings %s!%n", World.name());
}
}
2.コンパイル ※見易くするために一部改編しています。
# 呼び出される側のソースのコンパイル(①と②)
javac -d mods/org.astro org.astro/module-info.java org.astro/org/astro/World.java
# 呼び出す側のソースのコンパイル(③と④)
javac -modulepath mods -d mods/com.greetings com.greetings/module-info.java com.greetings/com/greetings/Main.java
3.実行
# com.greetingsモジュールのcom.greetings.Mainを実行。
java -modulepath mods -m com.greetings/com.greetings.Main
# 依存関係を定義しているorg.astroモジュールのorg.astro.Worldを実行される
>> 「Greetings world!」と出力
仮にcom.greetings/module-info.javaでモジュールorg.astroをrequiresしないようにするとクラスパス上は解決できてもコンパイルに失敗するようです。
===== ③com.greetings/module-info.java =====
module com.greetings {
// requires org.astro; ← この行をコメント!
}
# 呼び出す側のソースのコンパイル
javac -modulepath mods -d mods/com.greetings com.greetings/module-info.java com.greetings/com/greetings/Main.java
import org.astro.World;
^
src/com.greetings/com/greetings/Main.java:5: error: cannot find symbol
System.out.format("Greetings %s!%n", World.name());
^
symbol: variable World
location: class Main
2 errors
今までのANTやMavenなどのビルドツールが使えなくならない事を祈りたいです