説明
SpringBootのJarを他モジュールから使いたいときに
調べたことをまとめておきます。
Spring Bootのjarを単純に呼び出したいのですが
サンプルで学んだそのままだと、spring-boot-maven-pluginが実行可能jarを作成してくれる。
詳細はここいろいろ書いてある模様。
jarファイルの中に依存する(jar)を取り込んだ形のjar、Uber jar(Fat jar)と呼ぶらしい。
ファイルサイズは当然でかい。
Spring Boot用の実行可能形式になっているので、ライブラリ風に呼び出したい時には使えないらしい。
この時点のpom.xmlは以下の通り。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
じゃぁ呼び出すようにするにはどうしたらいいの?っていうことで、
Spring Boot Maven プラグインのドキュメントを見ることになる
- これまたサンプルそのままだと、spring-boot-starter-parent プロジェクトから継承しているので、repackageゴールを自分でpomに書かなくてもよいみたい。実際にSTSとかで「実効POM」でみるとすでに書かれているようだ。
5. 実行可能アーカイブのパッケージ化で気になる記述を見つける
元の(実行不可能な)アーティファクトはデフォルトで .original に名前が変更されますが、カスタム分類子を使用して元のアーティファクトを保持することもできます。
元のjarは.originalって名前になって、それとは別に実行可能形式のjarを作ってくれるようだ。
.originalをjar xvfで展開すると↓のような感じで、実行可能jarの内容とはだいぶ構成が違う。
│ application.properties
│
├─com
│ └─example
│ └─demo
│ DemoApplication.class
│ HelloController.class
│
├─META-INF
│ │ MANIFEST.MF
│ │
│ └─maven
│ └─com.example
│ └─demo
│ pom.properties
│ pom.xml
│
└─static
index.html
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ demo ---
[INFO] Building jar: C:\workspace\demo\target\demo-0.0.1-SNAPSHOT.jar
↑これがoriginalとみた
↓でゴニョゴニョやって実行可能にしてくれると想像
[INFO]
[INFO] --- spring-boot-maven-plugin:2.4.5:repackage (repackage) @ demo ---
[INFO] Replacing main artifact with repackaged archive
で結局ですが、すべてはここ(https://spring.pleiades.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#packaging.examples.custom-classifier) に書いてありました。
デフォルトでは、repackage ゴールは元のアーティファクトを再パッケージ化されたアーティファクトに置き換えます。これは、アプリケーションを表すモジュールの正常な動作ですが、モジュールが別のモジュールの依存関係として使用される場合、再パッケージ化されたモジュールの分類子を提供する必要があります。その理由は、依存クラスが再パッケージ化された jar のクラスをロードできないように、アプリケーションクラスが BOOT-INF/classes にパッケージ化されているためです。
その場合、または元のアーティファクトを保持し、別の分類子を使用して再パッケージ化されたアーティファクトを添付する場合は、次の例に示すようにプラグインを構成します。
実行可能jarは別モジュールの依存関係としてしようできないようにしてあるから、
そういう時は、元(.original)を使ってねということらしい。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>repackage</id>
+ <configuration>
+ <classifier>exec</classifier>
+ </configuration>
+ </execution>
+ </executions>
</plugin>
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ demo ---
[INFO] Building jar: C:\workspace\demo\target\demo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.4.5:repackage (repackage) @ demo ---
[INFO] Attaching repackaged archive C:\\workspace\demo\target\demo-0.0.1-SNAPSHOT-exec.jar with classifier exec
- demo-0.0.1-SNAPSHOT.jar(呼び出す用。実行可能ではないjar)
- demo-0.0.1-SNAPSHOT-exec.jar(実行可能jar)
ができました。
さらにattachオプションをfalseにすることで、元のファイル(実行可能ではないjar)だけが
インストールされるようになりました。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
終わりに
SpringBootの実行可能jarをよく理解できていなかったので、
何も考えず別モジュールからでも使えるものだと勘違いしていました。
なんとなくでも理解できてよかったです。