Java9 Jigsaw と Maven

Java9 も一般公開リリースされて日数も経ったが、まだ仕事の現場で使用されたというのは聞こえてこない。
Jigsaw モジュール定義で公開したいものだけを module-info.java に書いて、参照側でモジュール定義名を参照限定する機能、
ソース管理と伴に隠蔽化したいものを隠蔽できて魅力的だと思っていた。
いざ、Maven で使用するとどうも、安定しない。
→ そんなことない。pom.xml で descriptorRef jar-with-dependencies の記述が不足していた。

例)fooService というモジュールを用意

module fooService{
   exports org.app.foo;
   exports org.app.salon;
}

参照側の pom.xml に書くプラグイン、compilerArgs で、 --add-modules として追加するものを指定する。

<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>

参照側の module-info.javaEclipseではエラーになる。

module org.app.web{
   requires fooService;
}

参照側の module-info.java を作らないことにすると、
参照されるモジュールの JAR の中で、exports を書いてないものは参照不可=アクセス不可になって、
目的は果たして良いのだけど、参照側で、module-info.java を記述すると、Maven がどうも良く動かない。

Maven でうまく動かないとなると、ライブラリ管理をMaven に頼るのもつらくなってくる。
Eclipse プロジェクト参照や外部JARの読み込みを併用するか。。。

FooLib プロジェクトに module を用意する。

package org.foo を公開モジュールとして、

module foo{
   exports org.foo;
}

を、FooLib/src に置く。

<classpathentry combineaccessrules="false" kind="src" path="/FooLib">
   <attributes>
      <attribute name="module" value="true"/>
   </attributes>
</classpathentry>

使用側で、

module sample{
   requires foo;
}

oboe2uran.hatenablog.com