SpringBootことはじめ　2.gradleで実行可能なwarファイルを作る

# はじめに
[前回](https://qiita.com/suganury/items/a7f33d0a3994a90bd3f0)、SpringMVCでHelloWorldのREST APIを作成したので
これを実行可能なwarにアーカイブし、実際に実行してみるところまでやってみる。

# 環境

|ソフトウェア|バージョン|
|:--:|:--:|
|OS|Windows10 Pro|
|Java|JDK12|
|Eclipse|2020-12 M1|
|SpringBoot|2.4.0|
|Spring Tool Suite (STS) |4.8.1|

# 実施

## 0. 前回作成したHelloWorld REST API アプリ

```java:HelloController.java
@RestController
public class HelloController {

    @RequestMapping("/")
    public String home() {
    	return "Hello World!";
    }

    @RequestMapping("/sb")
    public String helloSp() {
        return "Hello SpringBoot!";
    }

}
```

```java:HelloSpringApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloSpringApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloSpringApplication.class, args);
	}

}

```

warを起動してここのエンドポイントにアクセスするのがゴール。


## 1. Gradleにwarプラグインを追加、bootWarタスク実行
実行可能なwarを作るにはgradleにwarプラグインを追加すればいい。
ついでに生成されるwarファイル名を指定する。
`bootWarタスク`に`archiveName`で指定できる。

```groovy:build.gradle
plugins {
	id 'org.springframework.boot' version '2.4.0'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
	id 'eclipse'
	id 'war' //★ここを追加★
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '12'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

// ★warファイル名を指定★
bootWar {
  archiveName 'HelloSpringApp.war'
}

```

warプラグインを追加して`gradle tasks`でタスクを確認すると
`bootWar`が追加されるのでそれを実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/56a0245e-cf75-0427-841d-6b4fc9070394.png)

```:bootWar実行
M:\develop\repository\git\practice2\HelloSpring>gradle bootWar

BUILD SUCCESSFUL in 41s
4 actionable tasks: 4 executed
```

成功すればプロジェクトの`build/libs`配下にwarファイルが生成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/b655caba-150e-c0ad-17cc-95c60d8dd7b3.png)


## 2. warファイルの起動
作成したwarファイルを`java -jar {warファイル名}`で起動できる。

```
M:\develop\repository\git\practice2\HelloSpring\build\libs>java -jar HelloSpringApp.war

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.0)

2020-11-25 23:19:40.149  INFO 13388 --- [           main] com.example.demo.HelloSpringApplication  : Starting HelloSpringApplication using Java 12.0.2 on xxxxx with PID 13388 (M:\develop\repository\git\practice2\HelloSpring\build\libs\HelloSpringApp.war started by xxxx in M:\develop\repository\git\practice2\HelloSpring\build\libs)
2020-11-25 23:19:40.151  INFO 13388 --- [           main] com.example.demo.HelloSpringApplication  : No active profile set, falling back to default profiles: default
2020-11-25 23:19:41.212  INFO 13388 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-11-25 23:19:41.223  INFO 13388 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-11-25 23:19:41.223  INFO 13388 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.39]
2020-11-25 23:19:41.684  INFO 13388 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-11-25 23:19:41.685  INFO 13388 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1489 ms
2020-11-25 23:19:41.829  INFO 13388 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-11-25 23:19:41.968  INFO 13388 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-11-25 23:19:41.976  INFO 13388 --- [           main] com.example.demo.HelloSpringApplication  : Started HelloSpringApplication in 2.181 seconds (JVM running for 2.504)
```

この状態で以下にアクセスしてみる。

- `http://localhost:8080/`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/b16c390a-469a-d3fc-e39a-2d8a7bb2702b.png)


- `http://localhost:8080/sb`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/1f31a511-34a6-cb29-6934-41c7b98bf49e.png)

やったぜ。:vulcan:

tomcatを内包してるのでこのwarアーカイブをそこらへんのサーバにデプロイすれば
そのままWebアプリとして公開できる。
（こんな単純なアプリは無いだろうけど）

mainクラスを指定するmanifestはgradleに書かなかったけど
よしなに`@SpringBootApplication`のクラスを探してくれるっぽい？


# まとめ
とりあえずアーカイブ化の方法は取得完了。
後々のCI/CDのCD部分で役に立つ・・・といいなぁ。

# 参考
[Spring Boot + Gradleでwarファイルを作成する方法](https://confrage.jp/spring-boot-gradle%e3%81%a7war%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/)