実行可能なjarと依存ライブラリが梱包されたzipアーカイブを作る、という方法で実行可能モジュールを作成していたのだけど、かなり無駄な構成になっているなと感じていた。
一つのjarファイルに全てのライブラリが同包されて、そのjarが実行できたほうがずっといい。
ということで今回の目標
- コマンドから java -jar で実行可能なエントリーポイントを含むjarを作る
- 上記jarで必要なライブラリ類はjarに同包されていること
外部に依存することなく1つのjarファイルだけでエントリーポイントからの処理が実行できるようにする。
使用するプラグインは maven-assembly-plugin。
maven-assembly-plugin
デフォルトアーカイブ jar-with-dependencies を使用し、エントリーポイントとなるmainClassを定義しておくだけで、目的のjarファイルが作成される。
<pom.xml>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>sample.Main</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-sample-jar</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
これだけ。前と比べてpom.xml自体もとても簡潔になった。
最初にこの設定が出来なかったのは、親モジュールに[descriptors]が定義されていたため。
親モジュールにこれが定義されていると、アセンブリファイルの位置の上書きはできるけど、アセンブリファイルを”使わない”という設定ができない。
[descriptorRefs]を使用してもアセンブリファイルがないとビルドエラーとなる。
今回はプロジェクトの構成をもう一回見なおして、[descriptors]を親モジュールで定義する必要がないとわかったので、それぞれのモジュールで[descriptors]か[descriptorRefs]を定義させるようにして解決。
mavenは使い方になれるまで難しい。
参考にさせて頂きました。jarファイルを作成するときに参照するライブラリをjarファイルに取り込みたかったのですが、上記の方法でうまくいきました。
お役に立てて何よりです!