元営業WEBエンジニアのアプリ開発日記

営業出身のWEB系エンジニアが気になったものから作ってはメモを残してくブログ

TomcatでHelloWorldを表示するSpringBootアプリケーションを作る

概要

この前DockerでNginx, Tomcat, MySQL環境作成の記事を書いたんで、そこで動かす簡単なSpringBootアプリを作るとこまで忘れないようにメモ書いとこー
EclipseはVersion: Oxygen.1a Release (4.7.1a)使ってます

アプリを作る

とりあえずGitでレポジトリ作ってcloneする

GitHubで適当なリポジトリ作ってローカルにクローン。

mkdir -p ~/git/future_api
cd ~/git/future_api
git clone [作成したレポジトリのclone用URL] .

SpringBootの雛形をGetしてGit環境に配置

SpringInitializerを使うとよろしく初期状態のアプリをゲットできる。
小難しいことはわからんのでとりあえず以下設定してzipファイルをげっと。

  • Generate a 「GradleProject」 with 「Java」 and Spring Boot 「2.0.4」
  • Group 「xyz.ucwork」
    • ドメインを逆から呼んだやつにした。きっと本当はなんでも大丈夫
  • Artifact 「future」
    • 作りたいアプリケーションにつけるならこんな名前的なのつけた
  • Dependenciew Web
    • どうせあとから追加できるしWebだけ選択

取得したzipファイルを作成したgitレポジトリで解凍!!

cd ~/git/future_api/
cp ~/Downloads/future.zip .
unzip future.zip
rm future.zip
tree -aL 1
.
├── .git
├── README.md
└── future

私の書いたDocker環境参考にすると以下のようにアプリの名前ディレクトリ(future)と同階層にdockerディレクトリがいたほうが良さげ

tree -aL 1             
.
├── .git
├── README.md
├── docker
├── docker-compose.yml
└── future

Eclipseで読み込む

IDEは各々やりたい環境でやってもらえばいいんですが私はEclipse!

はじめはgitリポジトリをimportとかしてたんですが、パッケージが表示されず、フォルダ形式でしか出てこない問題にぶつかりやめた。
Javaプロジェクトとして読み込まなきゃいけないのね。

とりあえずEclipse用のワークスペースを作成&Eclipse用の設定を作成

mkdir -p ~/programming/workspace

cd ~/git/future_api/future
./gradlew eclipse

Eclipse開いたら作成した上記ディレクトリ(~/programming/workspace)をワークスペースとして起動。
そして以下手順で作成したプロジェクトを読み込みじゃ!

  • ファイル→インポート→一般→既存プロジェクトをワークスペース→次へ
  • ルート・ディレクトリーの選択で参照から「~/git/future_api/future」を選択→完了

Docker環境にデプロイ

前書いた記事とかぶっちゃう部分あるけどまぁいいや

Docker環境を立ち上げる

私のDocker記事を参考に各種ファイルを作成してコンテナを立ち上げる。
※「tournament」て書いてあるところは全て自分の好きなものに変えてね

tree -aL 1             
.
├── .git
├── README.md
├── docker
├── docker-compose.yml
└── future

docker-compose up -d --build

docker-compose ps                                                                                                                                                                                                           [master]
    Name                   Command               State                       Ports
-------------------------------------------------------------------------------------------------------
mailcatcher01   /run.sh                          Up      0.0.0.0:1025->1025/tcp, 0.0.0.0:1080->1080/tcp
mysql01         docker-entrypoint.sh /entr ...   Up      0.0.0.0:3306->3306/tcp
nginx01         nginx -g daemon off;             Up      0.0.0.0:80->80/tcp
tomcat01        /bin/sh -c /usr/bin/superv ...   Up      0.0.0.0:8000->8000/tcp, 8080/tcp

warファイルをtomcatに展開できる用にソースを設定

warファイル展開対応

build.gradleにapply plugin: 'war'providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")追記

...

apply plugin: "war"

...
dependencies {
...

    // Tomcatにwarを展開するためのライブラリ
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
}

warファイルをTomcatに展開するために必要な以下javaクラスをFutureApplication.javaと同じパッケージに作成

package xyz.ucwork.future;

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

/**
 * warファイルをTomcatに展開するにあたって必要らしい
 *
 */
public class ServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(FutureApplication.class);
    }
 }

HelloWorldなコントローラ作成

FutureApplication.java@RestControllerつけて@RequestMapping("/")なメソッドを追記

package xyz.ucwork.future;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class FutureApplication {

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

    @RequestMapping("/")
    public String function() {
        return "HelloWorld";
    }
}

アプロケーションログの出力

やってもやらなくてもいいですが以下2ファイルを追加するとtomcat01コンテナの/usr/local/tomcat/logs/application-future.logにアプリケーションログが出力される。

/future/src/main/resources/logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

/future/src/main/resources/application-local.yml

logging:
    file: logs/application-future.log

Gradleでビルド&DockerのTomcatにデプロイ

cd ~/git/future_api/future
./gradlew clean build war
cp build/libs/future-0.0.1-SNAPSHOT.war ../docker/tomcat01/deployment/future.war

ブラウザで動作確認

/etc/hostsファイルに127.0.0.1 future.local追記してブラウザにアクセスしてHelloWorldって出たらOKやで

http://future.local/

まとめ

Dockerの記事と合わせてみてくだされー