IDE(IntelliJ)で、springbootアプリのJarファイルを作成して配布する方法。

週末、死ぬ程、苦労したので、備忘録的に記載します。
```
尚、「Springboot appの作成」は、このサイトの通りでできます。
IntelliJ IDEA Community EditionでSpring Bootプロジェクトを作成し起動する
https://www.aruse.net/entry/2019/08/03/040855
＜他の参考記事＞
https://multimineral-tech.com/entry/2020/12/23/184054
https://pleiades.io/help/idea/getting-started-with-gradle.html#run_terminal
```

＜最終的にやりたい事＞
「SpringBootアプリを、Spring Initializerで作成して、それをIntelliJで編集した上で、IntelliJ上でFatJarファイルに圧縮して、配布する。」と言う事。

<何が分からなかったのか？＞
要は、IntelliJに、外部配布可能なJarファイル作成機能があることを知らなかった。そうであるから、当然、その使い方が分からなかったと言う非常に単純な話。

＜詳細＞
尚、Spring Bootアプリ自体を、IntelliJ上で動作させる事は簡単。
Spring Intializerで作成して、そのフォルダをIntelliJから読み込むだけ。
（https://start.spring.io/）　
ただ、IDE経由で動かす場合は、IDE自体の機能を各種利用しているから動作するのであって、OS(Mac Terminal)から直接叩くと、それらの機能が使えないので、当然だけど動かない。よって、Jarファイルを、IntelliJの機能を使って、作成する必要がある。
Jarファイルを作成さえすれば、それは後は配布するだけで良い。

＜話の単純化＞
ここまで絞り込んだ上で、ここでは話を単純化する。
あくまでも、今回、問題となったのは、IntelliJでJarファイルを作成する部分なんだから、SpringBootアプリの件は忘れる。
①Javaアプリ（よくあるFizzBuzzプログラム）を、IntelliJで構築して、
②それを、IntelliJで動くのを確認した上で、
③JarファイルをIntelliJ上で作成して、
④そのJarファイルが、IntelliJのターミナルで動作するのを確認して、
⑤最終工程として、Macのターミナルからアクアセスして、動作することを確認する。

＜手順＞
下記が手順となる。
①Javaアプリ（よくあるFizzBuzzプログラム）を、IntelliJで構築します。
IntelliJを開いて、「新規プロジェクト」をクリックする。
![a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/28706f7f-e10f-4fa9-0c94-aa55ee1ee4f3.png)

 名前を適当につける。FizzBuzz2とする。尚、Build Systemは、今回はGradleを使用する。
![a2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/af6e615d-6289-3b47-818f-dbba8e64294c.png)

上で「作成」ボタンを押すと、自動的に作成される。（便利ですね。）
![a21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/7fdf3204-7ecf-3c69-0aba-07b03067ac6f.png)

プロジェクトツールウィンドウで、src フォルダーを開きます。
main ディレクトリをクリックしてから、java サブディレクトリを右クリックし、リストから新規 | パッケージを選択します。

![x1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/d6b26c93-1035-fffc-8194-3234f94ccc10.png)

こんな感じの新規パッケージダイアログで、出てくるので、パッケージの名前は、ここでは、 com.gradle.tutorial としましょう。
![x2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/ca00bf04-3eb6-eeb3-ccfe-fa35a6aaf9dd.png)

同様に、パッケージを右クリックして、新規 | Java クラスを選択します。
![x2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/c0df523b-d1e7-63a4-9c4b-f70b43e84399.png)

新規 Java クラスダイアログで Java クラスの名前を指定し、OK をクリックします。ここでは、FizzBuzzProcessor と書きましょう！
![x3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/28f88b14-2114-31da-0c5e-e1242bde8aaf.png)

次に、作成したテストクラスを開き、次のコードを追加します。
```
package com.gradle.tutorial;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class FizzBuzzTest {
    @Test
    public void FizzBuzzNormalNumbers() {

        FizzBuzzProcessor fb = new FizzBuzzProcessor();
        Assertions.assertEquals("1", fb.convert(1));
        Assertions.assertEquals("2", fb.convert(2));
    }

    @Test
    public void FizzBuzzThreeNumbers() {

        FizzBuzzProcessor fb = new FizzBuzzProcessor();
        Assertions.assertEquals("Fizz", fb.convert(3));
    }

    @Test
    public void FizzBuzzFiveNumbers() {

        FizzBuzzProcessor fb = new FizzBuzzProcessor();
        Assertions.assertEquals("Buzz", fb.convert(5));
    }

    @Test
    public void FizzBuzzThreeAndFiveNumbers() {

        FizzBuzzProcessor fb = new FizzBuzzProcessor();
        Assertions.assertEquals("Buzz", fb.convert(5));
    }
}
```

②　一応、IntelliJで動くのか否かの確認をします。
ガターで、App toolwindows tool window run をクリックし、実行 'FizzBuzzProcessor.main()' を選択します。
![x5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/18c19822-a91f-1ee3-a6e4-53d93321198a.png)
きちんと、Javaアプリが動いている事が確認できました。

③JarファイルをIntelliJ上で作成します。
さて、ここからが本題です。
このアプリを、Jarファイルに圧縮します。（圧縮して、持ち運び可能とする為です。）
とは言っても、非常に簡単です。

まず、下準備します。
プロジェクトツールウィンドウで、build.gradle ファイルをダブルクリックしてエディターで開きます。
![a10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/1fd32cbd-0095-aa81-cd03-b2952a2e37bc.png)

次に、次のコードを追加して、保存します。
```
jar {
    manifest {
        attributes "Main-Class": "com.gradle.tutorial.FizzBuzzProcessor"
    }

    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
```
IntelliJ IDEA で Gradle プロジェクトをインポートすると、自動で Gradle のプラグインがインストールされます。ウインドウ右側に「Gradle」タブがあるのでここを広げて build を実行します。
右側のペインに、「Gradle」と表示されているので、ここをクリックする。
![a23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/213924a1-ea1c-6faf-e704-8ac0a10aed9d.png)

・ウインドウ右側の「Gradle」タブをクリック
・[プロジェクト名] > [Tasks] > [build] > [build] を選択
ここをダブルクリック、もしくは、右クリックで [Run プロジェクト名] をクリック。ウインドウ下部にビルド結果が表示されます。「BUILD SUCCESSFUL」と表示されたら成功です。
![a3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/6f1e7b49-c743-1b72-c5b0-f540ddbb9213.png)
ここまでで、Jarへのビルトが完了した筈です。確認してみます。
このように、JAR ファイルを含む build ディレクトリが作成されているのがわかります。
![x6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/fd55035f-9ad4-c24e-6187-74df9f2c0272.png)

【尚、ビルドに失敗する場合があります。】
https://stackoverflow.com/questions/67265308/gradle-entry-classpath-is-a-duplicate-but-no-duplicate-handling-strategy-has-b
その場合は、buid.gradleファイルに、下記を追記。
```
jar {
   duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
}
```

④ Jarファイルが、IntelliJのターミナルで動作するのを確認してみます。

java -jar FizzBuzz2.1.0-SNAPSHOT.jar
![a13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/15dacfe6-b5b8-49f5-2ec4-5749138bc6dc.png)
Enterを叩くと、こんな感じで実行されます。
従って、ターミナルでも動くことが確認できました。
![x7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/821a709e-6042-d564-256a-3adf59611690.png)

⑤念の為、MacOSのターミナルから直接アクアセスしても、動作することを確認してみる。
上の④と同じですが、IntelliJを完全に離れて、MacOSのターミナルから動かしてみましょう。（IntelliJのアプリ自体を終了して試しております。）　勿論、このように正常に動作しております。

```mac.terminal
testtest@testtest-mac JetBrains % ls
FizzBuzz2	Demo	   SpringTutorial
testtest@testtest-mac JetBrains % cd FizzBuzz2
testtest@testtest-mac FizzBuzz2 % ls
build		gradle		gradlew.bat	src
build.gradle	gradlew		settings.gradle
testtest@testtest-mac FizzBuzz2 % cd build
testtest@testtest-mac build % ls
classes		generated	libs		tmp
testtest@testtest-mac build % cd libs
testtest@testtest-mac libs % ls
FizzBuzz2-1.0-SNAPSHOT.jar
testtest@testtest-mac libs % java -jar FizzBuzz2-1.0-SNAPSHOT.jar
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
testtest@testtest-mac libs 
```