mike-neckのブログ

Java or Groovy or Swift or Golang

Jigsawのモジュールのリスト作ってみた #java #Jigsaw

さっきのエントリー

mike-neck.hatenadiary.com

で、LTしてきたと書いたのですが、その際に、Jigsawのモジュールがどのように分割されたのか気になったので、調べてみました。

なお、クラス数が膨大なので、このエントリーには載せません。

github.com

上記リポジトリーのg3-mod-apiというディレクトリーに以下の二つのファイルが有ります。

上記のリポジトリーをクローンするなり、ダウンロードするなりして、確認してみてください。

  • module-list.txt - モジュールの一覧
  • module-files.txt - モジュールに含まれるクラスファイルの一覧

module-files.txtファイルを調べれば、Jigsawを利用した時にrequireするべきモジュールがわかると思います。例えばjava.sql.Driverを利用する場合などは、

$ grep "java/sql/Driver" module-files.txt
build/mods/java.sql.jmod/classes/java/sql/Driver.class
build/mods/java.sql.jmod/classes/java/sql/DriverAction.class
build/mods/java.sql.jmod/classes/java/sql/DriverInfo.class
build/mods/java.sql.jmod/classes/java/sql/DriverManager$1.class
build/mods/java.sql.jmod/classes/java/sql/DriverManager$2.class
build/mods/java.sql.jmod/classes/java/sql/DriverManager.class
build/mods/java.sql.jmod/classes/java/sql/DriverPropertyInfo.class

と出てくるので、require java.sql.jmod; という記述をmodule-info.javaに追加すればよいことになります。

また、Nashornを利用したい場合などは、

$ grep "javax/script/ScriptEngineManager" module-files.txt
build/mods/java.scripting.jmod/classes/javax/script/ScriptEngineManager$1.class
build/mods/java.scripting.jmod/classes/javax/script/ScriptEngineManager.class

と出てくるので、require java.scripting.jmod; という記述をmodule-info.javaに追加すれば良いことになります。

まあ、JDK9が出たら、その辺りはIDEが対応してくれると思うので、それまでの間は上のやつを使ってみてください。

おわり

【2015/11/29 2:56 追記】

さくらばさんからツッコミをもらいました。

java -listmodsでモジュールの一覧が取得できる

実行結果は以下のとおり。

$ jdk1.9.0.jdk/Contents/Home/bin/java -listmods
java.activation@9.0
java.annotations.common@9.0
java.base@9.0
java.compact1@9.0
java.compact2@9.0
java.compact3@9.0
java.compiler@9.0
java.corba@9.0
java.datatransfer@9.0
java.desktop@9.0
java.instrument@9.0
java.logging@9.0
java.management@9.0
java.naming@9.0
java.prefs@9.0
java.rmi@9.0
java.scripting@9.0
java.se@9.0
java.security.jgss@9.0
java.security.sasl@9.0
java.smartcardio@9.0
java.sql@9.0
java.sql.rowset@9.0
java.transaction@9.0
java.xml@9.0
java.xml.bind@9.0
java.xml.crypto@9.0
java.xml.ws@9.0
javafx.base@9.0
javafx.controls@9.0
javafx.deploy@9.0
javafx.fxml@9.0
javafx.graphics@9.0
javafx.media@9.0
javafx.swing@9.0
javafx.web@9.0
jdk.accessibility@9.0
jdk.attach@9.0
jdk.charsets@9.0
jdk.compiler@9.0
jdk.crypto.ec@9.0
jdk.crypto.pkcs11@9.0
jdk.deploy@9.0
jdk.deploy.osx@9.0
jdk.hotspot.agent@9.0
jdk.httpserver@9.0
jdk.internal.le@9.0
jdk.internal.opt@9.0
jdk.jartool@9.0
jdk.javadoc@9.0
jdk.javaws@9.0
jdk.jcmd@9.0
jdk.jconsole@9.0
jdk.jdeps@9.0
jdk.jdi@9.0
jdk.jdwp.agent@9.0
jdk.jfr@9.0
jdk.jlink@9.0
jdk.jvmstat@9.0
jdk.localedata@9.0
jdk.management@9.0
jdk.naming.dns@9.0
jdk.naming.rmi@9.0
jdk.pack200@9.0
jdk.plugin@9.0
jdk.plugin.dom@9.0
jdk.policytool@9.0
jdk.rmic@9.0
jdk.scripting.nashorn@9.0
jdk.scripting.nashorn.shell@9.0
jdk.sctp@9.0
jdk.security.auth@9.0
jdk.security.jgss@9.0
jdk.snmp@9.0
jdk.xml.bind@9.0
jdk.xml.dom@9.0
jdk.xml.ws@9.0
jdk.zipfs@9.0
jdepsコマンドで使っているモジュールの一覧が取得できる

ためしに、Java8でコンパイルしたjarにjdepsをおこなってみた

$ jdk1.9.0.jdk/Contents/Home/bin/jdeps build/jars/test.frameworkJar/test.framework.jar
test.framework.jar -> java.base
   test (test.framework.jar)
      -> java.lang                                          
      -> java.lang.annotation                               
      -> java.lang.invoke                                   
      -> java.util                                          
      -> java.util.function                                 
      -> java.util.stream                                   
      -> test.exception                                     test.framework.jar
      -> test.exec                                          test.framework.jar
   test.exception (test.framework.jar)
      -> java.lang
以下略

このように出力された。また、クラスに対しても同様に

$ jdk1.9.0.jdk/Contents/Home/bin/jdeps build/classes/test.frameworkJar/test/exec/TestExecutor.class 
TestExecutor.class -> java.base
TestExecutor.class -> 見つかりません
   test.exec (TestExecutor.class)
      -> java.lang                                          
      -> java.lang.annotation                               
      -> java.lang.invoke                                   
      -> java.lang.reflect                                  
      -> java.util                                          
      -> java.util.concurrent                               
      -> java.util.function                                 
      -> java.util.stream                                   
      -> test                                               見つかりません

という表示を得た。

また、さらに、-moduleというオプションがあり、それを使うと、モジュール名のみを表示してくれるようである。

$ jdk1.9.0.jdk/Contents/Home/bin/jdeps -module build/jars/test.frameworkJar/test.framework.jar 
test.framework.jar -> java.base
   test (test.framework.jar)
      -> java.lang                                          java.base
      -> java.lang.annotation                               java.base
      -> java.lang.invoke                                   java.base
      -> java.util                                          java.base
      -> java.util.function                                 java.base
      -> java.util.stream                                   java.base
      -> test.exception                                     test.framework.jar
      -> test.exec                                          test.framework.jar
   test.exception (test.framework.jar)
      -> java.lang                                          java.base
以下略

ところで、僕が欲しいのは、java.sql.Driverからjava.sql@9.0なんですけどね…