【Maven編】Spring Bootのビルドとデプロイ方法

【Maven編】Spring Bootのビルドとデプロイ方法

Spring Bootアプリケーションのビルドとデプロイ方法を知りたい人「ビルドとデプロイの方法を知りたいです。アプリケーションを実行するときはGUI(eclipseとか)で起動してます。実際の現場では本番環境で動作させるためにビルドとデプロイをする必要がありコマンドベースで知りたいです。どうか教えて下さい。」


そんな疑問に答えます。

今回はMavenを使用したアプリケーションのビルド・デプロイ方法を解説します。
Gradleを使用した場合のビルド方法については別の機会で解説する予定です。
デプロイ方法についてはMavenとGradleで共通だと思うので参考にしてみてください。

補足情報:そもそもビルドとデプロイとは?

ビルドとデプロイを簡単に説明すると以下になります。

  • ビルド:ソースコードをコンパイルし、実行可能なファイルとして1つのファイルにまとめること
  • デプロイ:ビルドして生成された実行ファイルを実行環境に配置し利用可能な状態にすること

つまり、

ビルド → デプロイ

といった流れで、実際の現場では開発したアプリケーションを本番環境で利用します。

Spring Bootアプリケーションのビルド方法(jarとwarを解説)

Spring Bootアプリケーションを実行可能なjarファイルとwarファイルへビルドする方法を以下の手順に分けて説明します。

  • Spring Boot Mavenプラグインの導入(共通)
  • pom.xmlの設定(jar編)
  • pom.xmlの設定(war編)
  • ビルド実行(共通)


それでは順に説明します。

【手順①】Spring Boot Mavenプラグインの導入(共通)

Spring BootではSpring Boot Maven プラグインを追加することで実行可能なファイルとしてパッケージ化することができます。

ファイルの形式は以下の2つです。

  • jarファイル
  • warファイル


実行可能なファイルができることで、本番環境へのリリースまでの時間が細かな設定が不要になるので短縮されます。※Spring Bootのメリットです。

Mavenの設定ファイルであるpom.xmlに以下を追加します。

(省略)	
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>
(省略)


Spring Initializerを使用してアプリケーションを作成した場合ははじめから記述されていると思います。その場合は変更しなくていいです。

また、このプラグインを使用すると、static void main(String[] args) メソッドでクラス検索し、自動で実行してくれます。

余計なこと考えなくても、うまくできているわけです。非常に便利。

実行クラスを明示したい場合は下記のようにプラグインの<configuration>要素に<mainClass>要素を追加します。

(省略)
<build>
	<plugins>
		<plugin>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-maven-plugin</artifactId>
    		<configuration>
        		<mainClass>com.example.app.Main</mainClass> ←実行クラス
    		</configuration>
		</plugin>
	</plugins>
</build>
(省略)


余談になりますが、Spring Initializerを使ったアプリケーションの開発については以下の記事が参考になるかと思います。気になる方は見てみてください。

以上でビルドするためのプラグインの導入方法はおわりです。

次ではビルドするための設定をjarとwarに分けて説明していきます。
読者の方は自分の環境に合わせて読んでみてください。

【手順②】pom.xmlの設定(jar編)

パッケージ方法はpom.xmlにpackaging要素を追加して決めます。
デフォルト値はjarなので記述しなくても大丈夫です。
明示的に記述したい場合は以下のようになります。

(省略)
	<properties>
		<java.version>1.8</java.version>
	</properties>

	<packaging>jar</packaging> ←これ

	<dependencies>
		<dependency>
(省略)


パッケージ形式をjarにする場合の設定は以上になります。

つまり、jar形式でパッケージングしたい場合はデフォルト設定のままでいいので、設定不要ということになります。(非常に楽)

【手順③】pom.xmlの設定(war編)

jar編でも記述したとおりパッケージ方法をpom.xmlに記述します。
以下のようにpackaging要素を追加してください。
※warの場合は必須です。

(省略)
	<properties>
		<java.version>1.8</java.version>
	</properties>

	<packaging>war</packaging> ←これ

	<dependencies>
		<dependency>
(省略)


次に、パッケージングする際にアプリケーションコンテナ(Tomcat)を内蔵しない設定を追加します。

理由は、warファイルのパッケージングの場合はTomcatが用意された環境に対してデプロイするので、特にTomcatを内蔵する必要がないからです。むしろ、Tomcatを内蔵することでファイルサイズが大きくなるので、内蔵しないようにしましょう。

設定は以下になります。
依存関係にspring-boot-starter-tomcatを追加し、<scope>要素に「provided」を指定してください。

(省略)  
<dependencies>
     (省略)
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
      </dependency>
     (省略)
</dependencies>
(省略)


パッケージ形式をwarにする場合の設定は以上になります。

追記:Javaのクラス変更も必要です。【重要】

war形式の場合はSpring Bootのアプリケーション実行するクラスを以下のように変更する必要があります。

package com.example.spring.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer{

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

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    	return builder.sources(DemoApplication.class);
  	}

}


SpringBootServletInitializerクラス」を継承し、「configureメソッド」をオーバーライドしてます。
これをしないと、warをデプロイした際に「404エラー」になってしまうので必ず変更してください。

【手順④】ビルド実行(共通)

実際にコマンドでビルドする場合はjarとwarでは共通のコマンドを実行することになります。
ビルド実行コマンドは以下になります。

mvn package spring-boot:repackage


上記は実際ビルドコマンドを実行した際の画像です。
実行後にターミナルに実行ログが出力されます。

ビルドが成功すると上記のようにログが出力されます。(BUILD SUCCESS)
ビルド結果の実行ファイル(jarファイルもしくはwarファイル)は以下のディレクトリに作成されます。

プロジェクトディレクトリ/target/


上記の画像ではwarファイルが作成されていることを確認できます。

Spring Bootのビルド方法についての説明は以上になります。
次はデプロイ方法についてです。

Spring Bootアプリケーションのデプロイ方法(jarとwarを解説)

Spring Bootアプリケーションのデプロイ方法について、パッケージ形式jarとwarに分けて説明します。

パッケージ形式がjarの場合から説明します。

【デプロイ方法①】jar編

パッケージ形式がjarの場合は非常に簡単な手順になります。

  1. 本番環境へjarファイルの配置
  2. jarファイルの実行
  3. 正常に起動確認(画面の表示)


順に説明します。

【手順①】本番環境へjarファイルの配置

本番環境(実行する環境)にビルドして作成されたjarファイルを任意のディレクトリに配置します。

※javaを実行できる環境である必要があります。

【手順②】jarファイルの実行

任意のディレクトリに配置できたら、以下のコマンドを実行します。
※プロパティ値も指定できますが、今回は一番簡単なコマンドです。

java -jar jarファイル

実行すると、内蔵されているTomcat上でアプリケーションが起動します。

上記の画像は実際にコマンド実行したときの例になります。
例では「demo-0.0.1-SNAPSHOT.jar」を実行してます。

実行すると、ターミナルに実行ログが出力されます。
赤枠では「Started」となっているので、正常に起動したことがわかります。

【手順③】正常に起動確認(画面の表示)

パッケージ形式がjarファイルの場合のアクセスする際のコンテキストパスは以下になります。

http://(ホスト名):(ポート番号)/

よって、今回の場合では「http://localhost:8080/demo」にアクセスすることで画面表示します。

うまく表示されました。
jar形式のデプロイが成功したことがわかります。


jar編のデプロイ方法についての説明は以上になります。
次は、パケージ形式がwarの場合を説明します。

【デプロイ方法②】war編

パケージ形式がwarの場合は、アプリケーションコンテナのTomcatがインストールされてある必要があります。

jar同様に手順は違いますが、簡単な手順になります。(下記の一つのみです。)

  1. Tomcatの所定のディレクトリにwarファイルを配置
  2. 正常に起動確認(画面の表示)


順に説明します。

【手順①】Tomcatの所定のディレクトリにwarファイルを配置

Tomcatがインストールされている環境で
tomcat\webapps\配下にビルドして作成されたwarファイルを配置して、Tomcatを起動すればデプロイ完了です。

※tomcatはtomcat\webapps\を監視していて、warファイルが置かれると自動でデプロイしてくれます。(非常に便利)

余談ですが、これは以前ツイートした内容です。わかっていたようでわかってなかったです。Javaのデプロイ方法が腑に落ちた瞬間でした。

それでは実際にwarファイル使用してアプリケーションを起動する例を見ていきましょう。

kohei@DESKTOP-I7QB2RT:/opt/tomcat/bin$ ./startup.sh 
Using CATALINA_BASE:   /opt/tomcat
Using CATALINA_HOME:   /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Tomcat started.

上記は実際にTomcatを起動した際のログです。
「Tomcat started」と出力されているので、正常に起動したことがわかります。

kohei@DESKTOP-I7QB2RT:/opt/tomcat/webapps$ ll
total 18372
drwxrwxrwx 1 tomcat   tomcat       4096 Apr 26 12:56 ./
drwxrwxrwx 1 root     tomcat       4096 Apr 25 13:04 ../
drwxrwxrwx 1 tomcat   tomcat       4096 Apr 25 13:04 ROOT/
drwxr-x--- 1 kohei kohei     4096 Apr 26 12:56 demo-0.0.1-SNAPSHOT/ ←Tomcatを実行後に自動で作成されたディレクトリ
-rwxrwxrwx 1 kohei kohei 19673222 Apr 26 12:55 demo-0.0.1-SNAPSHOT.war* ←作成したSpring Bootのアプリケーションのwarファイル
drwxrwxrwx 1 tomcat   tomcat       4096 Apr 25 13:04 docs/
drwxrwxrwx 1 tomcat   tomcat       4096 Apr 25 13:04 examples/
drwxrwxrwx 1 tomcat   tomcat       4096 Apr 25 13:04 host-manager/
drwxrwxrwx 1 tomcat   tomcat       4096 Apr 25 13:04 manager/

Tomcatが起動したあとに上記のように自動でSpring Bootアプリケーションのwarファイルが展開されて、アプリケーションのディレクトリができていることがわかります。

【手順②】正常に起動確認(画面の表示)

パッケージ形式がwarファイルの場合はjar形式と違いアクセスする際のコンテキストパスが変わります。

パスは以下になります。

http://(ホスト名):(ポート番号)/(warファイル名)/

よって、今回の場合では「http://localhost:8080/demo-0.0.1-SNAPSHOT/demo」にアクセスすることで画面表示します。

うまく表示されました。
war形式のデプロイが成功したことがわかります。


Spring BootアプリケーションのMavenを使用したビルドとデプロイの方法について説明は以上になります。
jarとwarで微妙に違う点があるので、参考になれば幸いです。


人気記事①:
【厳選4冊+α】Spring Framework初心者におすすめな本

人気記事②:現役エンジニアがおすすめするプログラミングスクール5社:無料あり