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

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

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

サンプルで学んだそのままだと、spring-boot-maven-pluginが[実行可能jar](https://spring.pleiades.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.first-application.executable-jar)を作成してくれる。
詳細は[ここ](https://spring.pleiades.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar.nested-jars.jar-structure)いろいろ書いてある模様。
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 プラグインのドキュメント](https://spring.pleiades.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/)を見ることになる

* これまたサンプルそのままだと、spring-boot-starter-parent プロジェクトから継承しているので、repackageゴールを自分でpomに書かなくてもよいみたい。実際にSTSとかで「実効POM」でみるとすでに書かれているようだ。

[5. 実行可能アーカイブのパッケージ化](https://spring.pleiades.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#packaging)で気になる記述を見つける

>元の（実行不可能な）アーティファクトはデフォルトで .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
``` 

``` mavenビルドのログ
[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)を使ってねということらしい。

``` diff: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）だけが
インストールされるようになりました。

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