search
LoginSignup
8

More than 1 year has passed since last update.

posted at

updated at

SpringBootでホットデプロイを行う2つの方法

エキサイト株式会社でメディア事業でエンジニアをしている佐々木です。
2020/12/19のXTechGroupのアドベントカレンダー担当させていただきます。今回は、SpringBootの初歩の初歩になります。

はじめに

弊社のメディア開発では、PHPで開発するのがメインの会社でしたが、私が入社してからSpring/Java等のトライアルで導入を進めております。PHPからJavaに変更するにあたり、静的型付言語でもサクサク開発できるように2つの方法を説明していきます。

SpringBoot + SpringBoot devtools

SpringBootには元々開発用のdevtoolsモジュールが提供されています。これを使用すると開発時に、 Hot RestartLive Reload の機能が提供されます。

(前提)SpringBootの最初の設定

※ もうプロジェクトがある人は読み飛ばしてください
ここ(https://start.spring.io/)にアクセスして、左側ProjectLanguageを設定し、右側のDependenciesSpring Web を選択し、下にある Generate ってボタンをクリックし、zipファイルをダウンロードし、展開して、IntelliJ で開きます。 これで準備完了です。

image.png

下記のようなディレクトリ構成になっているかと思います。

ディレクトリ構成
├── HELP.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── demo
    │   │               ├── DemoApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── example
                    └── demo
                        └── DemoApplicationTests.java

1. Spring Devtoolsを使ってホットデプロイする

1.1. 依存関係を追加

下記の設定をします。GradleとMaven両方記載しておきます。

Gradleの場合
Gradleの設定

dependencies {
   ..
   developmentOnly 'org.springframework.boot:spring-boot-devtools' // これを追加
   ..
}
Mavenの場合
Mavenの設定

<dependencies>
   ..
    <!-- ここから -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <!-- ここまでを追加 -->
   ..
</dependencies>

1.2. SpringBootの設定を追加

resources/application.properties or resources/application.yml のファイルに設定を追加。(デバッグモードではデフォルトで動作するので、記述は不要ですが一応)

application.propertiesの場合
application.propertiesの設定

## 下記2行を追加
spring.devtools.remote.restart.enabled=true
spring.devtools.livereload.enabled=true

application.ymlの場合
application.ymlの設定

## 下記を追加
spring:
  devtools:
    livereload:
      enabled: true
    restart:
      enabled: true

1.3. SampleControllerを作成

HTTPを受けるSampleControllerを作成します。

下記のファイルを作成し、中身を書きます。

java/com/example/demo/SampleController.java
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
public class SampleController {

    @GetMapping
    public String index(){
        return "Hello, Java";
    }
}

1.4. SpringBootの起動

SpringBootを起動します

java/com/example/demo/DemoApplication.java のファイルの下記の画像のように赤い枠の緑のボタンをクリックして、 デバッグ を選択します。

image.png

1.5. ブラウザで動作確認

http://localhost:8080/ を叩くと Hello , Spring が応答されるかと思います。

image.png

1.6. ソースコード変更

Controllerのソースを変更してみましょう。

java/com/example/demo/SampleController.java
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
public class SampleController {

    @GetMapping
    public String index(){
        return "Hello, Spring";  // Springに変更
    }
}

変更したら、 Macの方は cmd + F9 , Windowsの方は Ctrl + F9 を押してください。
ビルドが始まり、正常に完了すると、 SpringBootが HotRestartをしてくれます。

ezgif-3-b933d4c2707a.gif
Compileが完了すると自動的に再起動してくれます

ブラウザで確認すると、Hello Spring になっています

image.png

このHot Restart は再起動を手動でやるより高速です。体感では、30%〜50%くらい短くなるとおもいます。

1.7. ブラウザを自動で更新する live reload の設定

サーバが再起動する度にブラウザの更新ボタンを押すのは面倒です。 live reload と連携できるので、これを利用します。

  1. ブラウザ拡張をインストールします。
    Chrome: https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei
    Firefox: https://addons.mozilla.org/en-US/firefox/addon/livereload/

  2. ブラウザで先程の http://localhost:8080 を開いて拡張を有効にします。

拡張のボタンをクリックして、画像のような状態にしてください。(※SpringBootが起動しているときしかできません)

image.png

  1. ソースコードを書き換えて、buildを走らせてみる

準備ができたら、ソースコードを書き換えて、 buildしてみましょう。 Hot restart が完了したタイミングで、ブラウザもリロードされます。

ezgif-3-d8a0addb1a12.gif

<h2>Hello, Java</h2> にコードを書き換えてビルドすると、 Hot restart が完了したタイミングで、ブラウザがリロードされています。

SpringBoot devtools を使った Hot deployは以上になります。

2. DECVMによるホットデプロイ

SpringBoot devtools でHot Restart もいいのですが、再起動をしなくてもコードを反映したかったりすることはあると思います。

DCEVMはここで下記にあります。
http://dcevm.github.io/

JDK8とJDK11でインストール方法が異なるのですが、今回は、JDK11を使うこととします。

2.1 DCEVMのダウンロードとインストール

DCEVM:gihubこちらから、JDKをダウンロードして解凍します。

2.2 IntelliJでDCEVMを設定する

  1. File -> Project Structure -> Platform Settings -> SDKs の + をクリックし、 ADD JDK にて、先程の解凍したディレクトリを指定します。

  2. File -> Project Structure -> Project Settings -> Project の Project SDK を先程追加したJDKを指定します。

image.png

  1. SpringBootの設定を変更する
application.properties
## ここを変更
spring.devtools.remote.restart.enabled=false

application.ymlの場合
application.ymlの設定

## 下記を変更
spring:
  devtools:
    restart:
      enabled: false
  1. SpringBootを再起動して設定完了

2.2 コード変更する

では先程のコードを変更してみましょう。

ezgif-4-1e0274b96d25.gif

<h2>Hello, Java</h2>Hello, Javaに戻して、ブラウザ更新を手動で行っています。
DCEVMは、 Hot Restartの再起動の待ち時間がないので、その分速いのですが、 live reload が動作しません。

以上で、DCEVMを使ったHot deployは以上になります。

最後に

PHPからJavaでWeb開発する際に、よく言われるのがこの再起動問題なので、少しでも軽減できるように紹介しました。本当は、DCEVM + LiveReloadの組み合わせが一番効率的かなと思いますが、現状live reloadが動かないので、動かせるように試行錯誤を続けます。

エキサイト株式会社では、自社サービス開発ができるまたはやりたいエンジニアを広く募集しております。
連絡は下記からお願いいたします!

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
What you can do with signing up
8