Javaã®ã¢ãžã¥ãŒã«ã·ã¹ãã ãšã¯
Javaã®ã¢ãžã¥ãŒã«ã·ã¹ãã ã«é¢ããè°è«ãã¹ã¿ãŒãããã®ã¯15幎ã»ã©åã®ããšã«ãªããJavaã¢ããªã±ãŒã·ã§ã³ã®å€æ§åãJavaèšèªä»æ§ã®å·šå€§åã«ãã£ãŠïŒåŸæ¥ã®ããã±ãŒãžã®ä»çµã¿ã ãã§ã¯ã¯ã©ã¹ã©ã€ãã©ãªã®é©åãªæ§é åã管çãé£ãããªã£ããšããã®ããã®çºç«¯ã ãããŸããŸãªã©ã€ãã©ãªã®Jarãã¡ã€ã«ãè€éã«äŸåãåã£ãŠãããã®ç¶æ³ã¯ãJarå°çããªã©ãšåŒã°ããJava 9ã®ãªãªãŒã¹ã«å°ããŸã§åé¡èŠããç¶ããŠããã
Java 9ã«å°å ¥ãããã¢ãžã¥ãŒã«ã·ã¹ãã ã¯ããProject Jigsawããšãããããžã§ã¯ãåã§ä»æ§çå®ãšå®è£ ãé²ãããããJava Community Processã«ãããæ£åŒãªJSRã¯ãJSR 376: Java Platform Module Systemãã§ãOpenJDKãããžã§ã¯ãã§ã¯JEP 200ãäžå¿ãšããè€æ°ã®JEPã«ãã£ãŠæ§æãããŠããã
Jigsawã«ããã¢ãžã¥ãŒã«ã·ã¹ãã ã§ã¯ãè€æ°ã®ããã±ãŒãžãé¢é£ãããã®å士ã§ã°ã«ãŒãåããåå©çšå¯èœãªã¢ãžã¥ãŒã«ãšããŠç®¡çããããšãã§ãããå ·äœçã«ã¯ãåã¢ãžã¥ãŒã«ããšã«æ¬¡ã®ãããªèšå®ãè¡ãããšãå¯èœã«ãªãã
- ã¢ãžã¥ãŒã«éã®äŸåé¢ä¿ã®æç¢ºå: ã¢ãžã¥ãŒã«å士ã®äŸåæ§ãæç€ºçã«å®£èšããã¡ã«ããºã ãæäŸããããããã³ã³ãã€ã«æãšå®è¡æã®ããããã§äŸåæ§ãæ€èšŒã§ããã
- ã¢ãžã¥ãŒã«ã®å ¬éç¯å²ã®èšå®: ã¢ãžã¥ãŒã«å ã®ããã±ãŒãžã¯ãæç€ºçã«ãšã¯ã¹ããŒããããå Žåã®ã¿ãã»ãã®ã¢ãžã¥ãŒã«ããã¢ã¯ã»ã¹ã§ããã
Java 9以éã®Javaã§ã¯ããã®ã¢ãžã¥ãŒã«ã·ã¹ãã ãJDKã®æšæºã©ã€ãã©ãªã«å¯ŸããŠãé©çšããããJavaã®ã³ã¢ã»ãã©ãããã©ãŒã ã¯java.baseã¢ãžã¥ãŒã«ãã¯ãããšããè€æ°ã®ã¢ãžã¥ãŒã«ã«åå²ãããããããã®äŸåé¢ä¿ãå ¬éç¯å²ãæç¢ºåãããŠããã
次ã®å³ã¯Java 9ã«ãããJava SEãã©ãããã©ãŒã ã®ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ããŸãšãããã®ã ãéãç¢å°ã¯åŸè¿°ãããrequires transitiveã宣èšã«ããæšç§»çãªäŸåæ§ã衚ããŠãããã°ã¬ãŒã®ç¢å°ã¯ãrequiresã宣èšã«ããçŽæ¥çãªäŸåæ§ã衚ããŠããããŸããjava.base ã¢ãžã¥ãŒã«ã ãã¯ç¹å¥ãªååšã§ããã®ã¢ãžã¥ãŒã«ã«ã¯ java.lang ãã¯ãããšãã Java ããã°ã©ã ãå®è¡ããããã§äžå¯æ¬ ãªããã±ãŒãžãå«ãŸããŠããããã®ããããã®ã¢ãžã¥ãŒã«ã«å¯ŸããŠã¯ãã¹ãŠã®ã¢ãžã¥ãŒã«ãèªåçã« requires 宣èšããŠãããã®ãšããŠæ±ãããã
äžã®å³ã®èµ€æ ã§å²ãŸããŠããéšåã¯Java EEã«ç±æ¥ããAPIããŸãšããããã¢ãžã¥ãŒã«ã ããããã¯Java 9ã§éæšå¥šãšãªã£ãŠãããJava 11ã§æ£åŒã«åé€ããããäžæ¹ã§ãjava.net.httpãšjava.transaction.xaãšãã2ã€ã®æ°ããã¢ãžã¥ãŒã«ã远å ãããŠããããã®çµæãJava 11ã®ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã¯æ¬¡ã®å³ã«ç€ºããããªåœ¢ã«ãªã£ãŠããã
â»ãã詳现ã¯å ¬åŒã®APIããã¥ã¡ã³ããåç §ã®ããšã
ãã®ã¢ãžã¥ãŒã«åã®åœ±é¿ã§ãJava 8以åãšJava 9以éã§ã¯æšæºã©ã€ãã©ãªã®æ§æã倧ããç°ãªã£ãŠããããããã£ãŠãJava 8以åã«äœãããã·ã¹ãã ãç§»è¡ããéã«ã¯æ éã«äºææ§ã確èªããå¿ èŠãããã
ã¢ãžã¥ãŒã«ã䜿ã£ãããã°ã©ã ã®äŸ
ããã§ã¯ãæ©éJavaã®ã¢ãžã¥ãŒã«ã·ã¹ãã ã䜿ã£ãŠã¿ãããä»åã¯ããjp.mynavi.greetingããšããã¢ãžã¥ãŒã«ãšããããå©çšãããjp.mynavi.helloããšããã¢ãžã¥ãŒã«ã®2ã€ãäœã£ãŠã¿ããã¢ãžã¥ãŒã«åã¯ã°ããŒãã«ã«äžæã§ãªããŠã¯ãªããªããããããã±ãŒãžåãšåæ§ã«çµç¹ã®ãã¡ã€ã³åãéé ã«ããŠäœ¿ãã®ãæ £äŸãšãªã£ãŠããã
ãœãŒã¹ããªãŒã¯ã¢ãžã¥ãŒã«æ¯ã«åããŠæ§æããã®ã§ãä»åã®ã±ãŒã¹ã§ã¯äœæ¥ãã£ã¬ã¯ããªã®äžã«æ¬¡ã®ããã«2ã€ã®ãã£ã¬ã¯ããªãçšæããã
.
âââ jp.mynavi.greeting
âââ jp.mynavi.hello
jp.mynavi.greetingã¢ãžã¥ãŒã«ã®äœæ
jp.mynavi.greetingãã£ã¬ã¯ããªä»¥äžã®ãã¡ã€ã«æ§æã¯æ¬¡ã®ããã«ãªãããœãŒã¹ã³ãŒãã¯srcãã£ã¬ã¯ããªä»¥äžã«ããã±ãŒãžæ§æã«ãããã£ãŠé 眮ããããã®äŸã§ã¯ jp.mynavi.imajava.mylib ãšjp.mynavi.imajava.hidden ãšããããã±ãŒãžåã«ããŠããããããã¯åèªã®ããã±ãŒãžåã«å¿ããŠãã£ã¬ã¯ããªãæ§æããŠæ¬²ããã
jp.mynavi.greeting/
âââ src
âââ jp
â âââ mynavi
â âââ imajava
â âââ hidden
â â âââ HiddenGreeting.java
â âââ mylib
â âââ Greeting.java
âââ module-info.java
ãŸãã Greeting.java ã¯æ¬¡ã®ããã«ãããstatic 㪠hello() ã¡ãœãããã²ãšã€å®çŸ©ããŠããã
Greeting.java
package jp.mynavi.imajava.mylib;
public class Greeting {
public static String hello(String name) {
return "Hello " + name + "!";
}
}
HiddenGreeting.java ã¯ãããã±ãŒãžãç°ãªãã ãã§ Greeting.java ãšã»ãŒåãã§ããã
HiddenGreeting.java
package jp.mynavi.imajava.hidden;
public class HiddenGreeting {
public static String hello(String name) {
return "(Hidden) Hello " + name + "!";
}
}
ã¢ãžã¥ãŒã«ã«é¢ããèšå®ã¯ãsrcãã£ã¬ã¯ããªçŽäžã« module-info.java ãšããååã®ãã¡ã€ã«ãäœã£ãŠèšè¿°ããããã¡ã€ã«åãããåããããã«ããããJavaããã°ã©ã ã®äžçš®ã§ãããjp.mynavi.greeting ã¢ãžã¥ãŒã«ã®èšå®ã¯æ¬¡ã®ããã«ãªã£ãŠããã
jp.mynavi.greetingã®module-info.java
module jp.mynavi.greeting {
exports jp.mynavi.imajava.mylib;
}
ãmoduleãã¯ã¢ãžã¥ãŒã«ã宣èšããããã®ããŒã¯ãŒãã§ãããmoduleããŒã¯ãŒãã«ç¶ããŠã¢ãžã¥ãŒã«åãèšè¿°ããæ³¢æ¬åŒ§å ã«ã¢ãžã¥ãŒã«ã®èšå®ãèšè¿°ããã®ããã¢ãžã¥ãŒã«å®£èšã®åºæ¬åœ¢ã«ãªãã
ã¢ãžã¥ãŒã«å®£èšã®åºæ¬åœ¢
module ã¢ãžã¥ãŒã«å {
}
ãexportsãã¯ãã¢ãžã¥ãŒã«ã«å«ãŸããããã±ãŒãžã«å¯ŸããŠãã»ãã®ã¢ãžã¥ãŒã«ã®ã³ãŒãããã¢ã¯ã»ã¹ã§ããããšãæå®ãã宣èšã«ãªããé¢é£ãã宣èšã«ãexportsâŠtoãããããããã¯to以éã§æå®ããã¢ãžã¥ãŒã«ã«å¯ŸããŠã®ã¿ã¢ã¯ã»ã¹ãèš±å¯ãããšããæå³ã«ãªããä»åã®äŸã®å Žåã jp.mynavi.imajava.mylib ããã±ãŒãžã®ã¿å€éšããã®ã¢ã¯ã»ã¹ãèš±å¯ããŠããã jp.mynavi.imajava.hidden ããã±ãŒãžã¯å ¬éããŠããªãã
ã³ã³ãã€ã«ã¯éåžžéã javac ã³ãã³ãã§è¡ããã module-info.java ãå«ããã®ãå¿ããªãããã«ããããæ¬¡ã®äŸã®ããã«ã³ã³ãã€ã«ãããšãmods ãã£ã¬ã¯ããªä»¥äžã«classãã¡ã€ã«ãçæããããé·ãã³ãã³ããªã®ã§èŠãããããã«ã\ãã§åºåã£ãŠããããäžè¡ã§èšè¿°ããããšãã§ããã
$ javac -d mods \
> src/module-info.java \
> src/jp/mynavi/imajava/mylib/Greeting.java \
> src/jp/mynavi/imajava/hidden/HiddenGreeting.java
ããšã§å©çšããããããã«Jarãã¡ã€ã«ãäœæããŠããããæ¬¡ã®äŸã®ããã«ããã°ãjars ãã£ã¬ã¯ããªä»¥äžã« greeting.jar ãšãããã¡ã€ã«ãçæãããã
$ mkdir jars
$ jar -c -f jars/greeting.jar -C mods .
ã³ã³ãã€ã«ããã³Jarãã¡ã€ã«ã®çæãå®äºããåŸã® jp.mynavi.greeting ãã£ã¬ã¯ããªä»¥äžã®æ§æã¯æ¬¡ã®ããã«ãªãã
jp.mynavi.greeting/
âââ jars
â âââ greeting.jar
âââ mods
â âââ jp
â â âââ mynavi
â â âââ imajava
â â âââ hidden
â â â âââ HiddenGreeting.class
â â âââ mylib
â â âââ Greeting.class
â âââ module-info.class
âââ src
âââ jp
â âââ mynavi
â âââ imajava
â âââ hidden
â â âââ HiddenGreeting.java
â âââ mylib
â âââ Greeting.java
âââ module-info.java
jp.mynavi.helloã¢ãžã¥ãŒã«ã®äœæ
ç¶ããŠãjp.mynavi.hello ã¢ãžã¥ãŒã«ã®æ¹ãäœã£ãŠããããjp.mynavi.hello ãã£ã¬ã¯ããªã®æ§æã¯æ¬¡ã®ããã«ãªãã
jp.mynavi.hello/
âââ src
âââ jp
â âââ mynavi
â âââ imajava
â âââ hello
â âââ Hello.java
âââ module-info.java
Hello.java ã¯ãGreeting ã¯ã©ã¹ã® hello() ã¡ãœãããåŒã³åºãã
Hello.java
package jp.mynavi.imajava.hello;
import jp.mynavi.imajava.mylib.Greeting;
public class Hello {
public static void main(String[] args) {
String str = Greeting.hello("MYNAVI");
System.out.println(str);
}
}
ãããã£ãŠããã®ã¢ãžã¥ãŒã«ã¯ Greeting ã¯ã©ã¹ãå®çŸ©ãããŠãã jp.mynavi.greeting ã¢ãžã¥ãŒã«ã® jp.mynavi.imajava.mylib ããã±ãŒãžã«äŸåãããšããããšãªã®ã§ããã®ããã®èšå®ã module-info.java ã«èšè¿°ããŠãããªããã°ãããªãã module-info.java ã¯æ¬¡ã®ããã«ãªãã
jp.mynavi.helloã®module-info.java
module jp.mynavi.hello {
requires jp.mynavi.greeting;
}
requires ã¯ããã®ã¢ãžã¥ãŒã«ãæå®ãããã¢ãžã¥ãŒã«ã«äŸåããããšã宣èšããŠãããããã¢ãžã¥ãŒã«Aãå¥ã®ã¢ãžã¥ãŒã«Bãå¿ èŠãšããå Žåãã¢ãžã¥ãŒã«Aã§ã¯ requires 宣èšã«ãã£ãŠã¢ãžã¥ãŒã«Bãžã®äŸåé¢ä¿ãæç€ºããªããŠã¯ãããªãã
ããŠãã¢ãžã¥ãŒã«Aãã¢ãžã¥ãŒã«Bã«äŸåããã¢ãžã¥ãŒã«Bãã¢ãžã¥ãŒã«Cã«äŸåããŠããã±ãŒã¹ãèããŠã¿ãããã®å Žåãã¢ãžã¥ãŒã«Aã¯çŽæ¥ã¢ãžã¥ãŒã«Cã requires ããŠããããã§ã¯ãªãã®ã§ãã¢ãžã¥ãŒã«Cã«ã¢ã¯ã»ã¹ããããšã¯ã§ããªãããã ããã¢ãžã¥ãŒã«Bã® module-info.java ã®äžã§ãã¢ãžã¥ãŒã«Cããrequires transitiveãã䜿ã£ãŠäŸåæ§ã宣èšããŠããå Žåã«éã£ãŠãã¢ãžã¥ãŒã«Aããã¢ãžã¥ãŒã«Cãžã®ã¢ã¯ã»ã¹ãå¯èœã«ãªãã
ããŠãjp.mynavi.hello ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããããæ¬¡ã®ããã«ã³ã³ãã€ã«ããããšã§ãmods ãã£ã¬ã¯ããªä»¥äžã«åclassãã¡ã€ã«ãçæãããã
$ javac -d mods \
> --module-path ../jp.mynavi.greeting/jars/greeting.jar \
> src/module-info.java \
> src/jp/mynavi/imajava/hello/Hello.java
ãã®ã¢ãžã¥ãŒã«ã¯ jp.mynavi.greeting ã¢ãžã¥ãŒã«ãå¿ èŠãšãããããã³ã³ãã€ã«æã«ã¯ --module-path ãªãã·ã§ã³ã䜿ã£ãŠãã®å Žæãæå®ããŠããã javac ã³ãã³ãã java ã³ãã³ããã¢ãžã¥ãŒã«ã®èµ°æ»ãè¡ããã¹ã®ããšãã¢ãžã¥ãŒã«ãã¹ãšåŒã³ã--module-path ãªãã·ã§ã³ã¯æå®ããããã¹ãã¢ãžã¥ãŒã«ãã¹ã«è¿œå ããããã®ãã®ã ã
ãã --module-path ã®æå®ãããªãã£ãå Žåãjp.mynavi.greeting ã¢ãžã¥ãŒã«ãçºèŠã§ããªãããæ¬¡ã®äŸã®ããã«ã³ã³ãã€ã«ãšã©ãŒã«ãªãã
$ cd jp.mynavi.hello
$ javac -d mods \
> src/module-info.java \
> src/jp/mynavi/imajava/hello/Hello.java
src/module-info.java:2: ãšã©ãŒ: ã¢ãžã¥ãŒã«ãèŠã€ãããŸãã: jp.mynavi.greeting
requires jp.mynavi.greeting;
^
ãšã©ãŒ1å
ç¶ããŠãJarãã¡ã€ã«ãäœæãããã
$ mkdir jars
$ jar -c -f jars/hello.jar -C mods .
ããã§ãjars ãã£ã¬ã¯ããªã®äžã« hello.jar ãçæãããã¯ãã ããããŸã§å®äºããç¶æ ã®ãã¡ã€ã«æ§æã¯æ¬¡ã®ããã«ãªã£ãŠããã
jp.mynavi.hello/
âââ jars
â âââ hello.jar
âââ mods
â âââ jp
â â âââ mynavi
â â âââ imajava
â â âââ hello
â â âââ Hello.class
â âââ module-info.class
âââ src
âââ jp
â âââ mynavi
â âââ imajava
â âââ hello
â âââ Hello.java
âââ module-info.java
ã¡ãªã¿ã«ãjp.mynavi.hello ã¢ãžã¥ãŒã«ã jp.mynavi.greeting ã¢ãžã¥ãŒã«ã«äŸåããããšã¯æç€ºãããŠããããjp.mynavi.greeting ã exports ããŠããã®ã¯ jp.mynavi.imajava.mylib ããã±ãŒãžã ããªã®ã§ãäŸç¶ãšã㊠jp.mynavi.imajava.hidde ããã±ãŒãžã«ã¢ã¯ã»ã¹ããããšã¯ã§ããªãã
ããšãã° Hello.java ã§æ¬¡ã®äŸã®ããã« HiidenGreeting ã¯ã©ã¹ãå©çšããããšããå Žåã«ã¯ã³ã³ãã€ã«ãšã©ãŒã«ãªãã
jp.mynavi.imajava.hiddenããã±ãŒãžã«ã¢ã¯ã»ã¹ããããšããå Žå
package jp.mynavi.imajava.hello;
import jp.mynavi.imajava.hidden.HiddenGreeting;
public class Hello {
public static void main(String[] args) {
String str = HiidenGreeting.Hello("MYNAVI");
System.out.println(str);
}
}
jp.mynavi.hello ã¢ãžã¥ãŒã«ã®å®è¡
ããã§ã¯ã宿ããããã°ã©ã ãå®è¡ããŠã¿ãããjava ã³ãã³ããæ¬¡ã®ãããªãªãã·ã§ã³ã§å®è¡ããã°ãHello ã¯ã©ã¹ã® main() ã¡ãœãããå®è¡ãããŠãHello MYNAVI!ããšããåºåãåŸãããã
$ java --module-path ../jp.mynavi.greeting/jars/greeting.jar:jars/hello.jar \
> --module jp.mynavi.hello/jp.mynavi.imajava.hello.Hello
Hello MYNAVI!
ãŸããjp.mynavi.greeting ãš jp.mynavi.hello ã®2ã€ã®ã¢ãžã¥ãŒã«ã䜿ãã®ã§ãgreeting.jar ãš hello.jar ã®2ã€ã®Jarãã¡ã€ã«ã --module-path ãªãã·ã§ã³ã§ã¢ãžã¥ãŒã«ãã¹ã«å ããã
次ã«ããã®ããã°ã©ã ã®èµ·ç¹ãšãªãã¢ãžã¥ãŒã«ãæå®ããå¿ èŠããããããã¯ã¢ãžã¥ãŒã«ã¯ã«ãŒãã»ã¢ãžã¥ãŒã«ãšåŒã°ãããã®ã§ãjava ã³ãã³ãã®ã¢ããªã±ãŒã·ã§ã³ã©ã³ãã£ãŒã¯ãã®ã«ãŒãã»ã¢ãžã¥ãŒã«ããã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ãèµ°æ»ããŠãããã«ãŒãã»ã¢ãžã¥ãŒã«ã®æå®ã¯ --module ãªãã·ã§ã³ã§è¡ãã
æ¬çš¿ã®äŸã®å Žåãã«ãŒãã»ã¢ãžã¥ãŒã«ã¯ jp.mynavi.hello ã§ãããããã«ãã¢ãžã¥ãŒã«åã«ç¶ããŠã/ã¯ã©ã¹åãïŒmain()ã¡ãœãããæã£ãã¯ã©ã¹ã®ãããã±ãŒãžåä»ãã®åç§°ïŒãšèšè¿°ããããšã§ãæåã«å®è¡ãããã¯ã©ã¹ãæå®ããããšãã§ããã
ä»åã¯åºæ¬çãªJavaã®ã¢ãžã¥ãŒã«ã·ã¹ãã ã®äœ¿ãæ¹ã«ã€ããŠè§£èª¬ãããæ¬¡åã¯ããã®æ°ããã¢ãžã¥ãŒã«ã·ã¹ãã ãšåŸæ¥ã®ããã±ãŒãžã·ã¹ãã ãšã®é¢ä¿ããäž¡è ã®å ±åã®ããæ¹ãªã©ã«ã€ããŠç޹ä»ããã

