LoginSignup
0
0

More than 1 year has passed since last update.

SpringBootのJarを他モジュールから使いたい

Posted at

説明

SpringBootのJarを他モジュールから使いたいときに
調べたことをまとめておきます。

Spring Bootのjarを単純に呼び出したいのですが

サンプルで学んだそのままだと、spring-boot-maven-pluginが実行可能jarを作成してくれる。
詳細はここいろいろ書いてある模様。
jarファイルの中に依存する(jar)を取り込んだ形のjar、Uber jar(Fat jar)と呼ぶらしい。
ファイルサイズは当然でかい。
Spring Boot用の実行可能形式になっているので、ライブラリ風に呼び出したい時には使えないらしい。
この時点のpom.xmlは以下の通り。

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の内容とはだいぶ構成が違う。

demo-0.0.1-SNAPSHOT.jar.original
│  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)を使ってねということらしい。

pom.xml(抜粋)
 <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)だけが
インストールされるようになりました。

pom.xml(抜粋)
 <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をよく理解できていなかったので、
何も考えず別モジュールからでも使えるものだと勘違いしていました。
なんとなくでも理解できてよかったです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0