モジュール参照のJavaプログラムを実行するにはモジュール exportしている JARの置かれたパスを指定して
読み込めるように指定オプションと参照側のクラスを指定しないとならない。
java -m {モジュール検索先PATH} -p {実行するモジュール名}/クラス名
{モジュール検索先PATH}複数の場合、Windowsでは、";" セミコロン区切り、Linux なら ":"コロン区切り
Eclipse で実行する時は、実行構成の VM引数にこれを書かなくてはならず、めんどくさい。
実際、Maven プロジェクトで実行テストするケースが多いので、参照実行側の module-info を見つけられるように、
モジュール検索先PATH には、target/classes も付けないとならない。
-p target/classes;C:\Users\yipuran\.m2\repository\org\wa\model\models\1.0 -m org.wa.note/org.wa.note.NodeTest
これはPCのローカルリポジトリに models-1.0.jar という参照されるモジュールJARが存在して
org.wa.note パッケージで作成した module-info.class が、models-1.0.jarの モジュールに依存している場合だ。
手数がかかる。。
java -jar で実行する為に1つのJAR に纏めてしまえば、こんな手間は要らないが、Jigsawの目的である
依存によるプログラムの肥大化を防ぐということには反することになる。
でも、プログラム開発時、module-info 定義で、見せたくない~直接使用させたくない public を制限抑止するのには
モジュールの使用は有効だ。
pom.xml の記述
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalName>note</finalName> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>org.wa.note.NodeTest</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <source>9</source> <target>9</target> </configuration> </plugin> </plugins> </build>
これで、
java -jar note.jar
で実行できる。
しかし、Webアプリとしてはどうだろうか?
Eclipse WTP で用意して実行してみるがダメだった。
参照側ーWebアプリ側で、module-info.java を書かなければ、参照するものはきちんと参照もできて
module-info export 記述されてないパッケージへは使用できないようにコンパイルエラーにはなる。
半分目的は達成されているのだが、参照側で module-info を Webアプリではどこにどう書けばよいのか?
まだ、明確に理解していない。