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


はじめに

前回、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 アプリ

HelloController.java
@RestController
public class HelloController {

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

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

}
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で指定できる。

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が追加されるのでそれを実行。

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

BUILD SUCCESSFUL in 41s
4 actionable tasks: 4 executed

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

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/

  • http://localhost:8080/sb

やったぜ。

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

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

まとめ

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

参考

Spring Boot + Gradleでwarファイルを作成する方法