ども!今回は、JavaのSpring Bootをdevcontainerで開発するための環境構築を行いました。Javaバージョンとしては21を想定しています。Javaの環境構築は苦い思い出がありますが、今回もしっかり沼にはまってしまいました。Spring Bootはスタートアップだけなので、ひとまず環境構築の身を対象にしています。
終わりに向かいます
どもども!全身の筋肉痛から順調に回復している龍ちゃんです。二日ほどスノボをしてきたので、体のいたるところがバッキバキですね。アドレナリンが出ているときは、全く気にならないのが人間の不思議ですね。
さて!今回も環境構築系のお話になります。タイトルの通りですが、「JavaのSpring Bootをdevcontainerで構築する」ことを進めていきます。Javaの場合だと、バージョン情報が重要になるので、以下にバージョン情報を出しておきます。
対象 | バージョン情報 |
---|---|
Java | 21 |
Spring Boot | 3.2.2 |
Docker Java Base Image | eclipse-temurin:21-jdk-alpine |
それでは、始めていきます。
Java:Spring Bootでのdevcontainerを構築する
手順としては、以下になります。
- spring initializrでアプリケーションをゲットする
- docker-compose.ymlを構築する
- devcontainerを設定する
- hello worldを追加する
今回は、Spring Boot公式が出しているサービスを使って環境を作成します。ディレクトリ構造としては、以下になる想定です。
.
├── .devcontainer # devcontainer設定ファイル
│ └── devcontainer.json
├── Dockerfile # プロダクションビルド用
├── docker-compose.yml # devcontainer用docker-compose file
├── backend # spring-bootプロジェクト
└── README.md
それでは、始めていきましょう。
spring initializrでSpring Bootのアプリケーションを作成する
まずは、Spring Bootのアプリケーションを取得しましょう。spring initializrを使うことで、CLIを使うこともなく設定することができます。また、依存関係も追加することができます。
今回のアプリケーション名は「backend」で作成しています。依存関係として、Spring Boot Dev ToolsとSpring Webを追加で選択しています。
基本的に飛ばしても問題ありません。もし、権限回りmvnwの権限回りのエラーが起きた場合は、以下のコマンドを実行してください。
sudo chmod +x backend/mvnw
docker-compose.ymlを構築する
ここは好みですが、backend
のファイル内にtargetディレクトリを作成します。Dockerコマンドで自動生成した場合では、rootユーザーで作成されて削除が大変な場合があります。
mkdir backend/target
docker-compose.yml
は、ローカルのdevcontainerを起動するためのファイルとして用意します。
version: "3.7"
services:
spring:
image: eclipse-temurin:21-jdk-alpine
tty: true
volumes:
- ./backend:/app/
- target:/app/target
ports:
- 8080:8080
volumes:
target:
ビルド結果として保存されるtarget
をvolumes
としてバインドすることで、ビルド結果をコンテナ内に収めています。
devcontainerを設定する
devcontainer用の設定ファイルを用意します。
{
"dockerComposeFile": ["../docker-compose.yml"],
"service": "spring",
"workspaceFolder": "/app",
"forwardPorts": [8080],
"customizations": {
"vscode": {
"extensions": [
"vscjava.vscode-java-pack",
"vmware.vscode-boot-dev-pack",
"vscjava.vscode-spring-initializr"
]
}
},
"remoteUser": "root"
}
起動ファイルを指定して、ワークスペースをapp
にしています。拡張機能周りは、開発に必要そうなものを入れています。この辺は、素人なので別途参照してください。
起動しようや!!!
ここまでくれば、devcontainerを起動することができます。
出てきた検索で「Reopen in Container」をクリックしましょう。
Visual Studio Codeが再起動します。
起動が完了したら、右側の実行ボタンを押してみましょう。起動後、http://localhost:8080にアクセスしてみましょう。以下の画面が出力されたら成功です。
おまけ:hello worldを追加する
エラーページがトップに表示されるのは、気分的には微妙ですよね。というわけで、簡単にHello Worldを挿入して、Spring Bootの自動再起動を確認しましょう。起動したまま、ソースコードを変更してください。
package com.example.backend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class BackendApplication {
public static void main(String[] args) {
SpringApplication.run(BackendApplication.class, args);
}
@GetMapping("/")
public String requestMethodName() {
return new String("Hello world!!!!!!!");
}
}
Spring Bootが自動で立ち上がりなおせば、成功です。
初めから来ました
はい!終わりました。環境構築周りをずっとやっていたのですが、nodeとは違ってコマンドがまずわからないので苦労しました。次は、こちらで作成した内容をGitHub ActionsでAzure Web Appsにデプロイする作業をブログにまとめていきたいと思います。
これまでの環境構築周りを一覧にまとめておきます。
ではまた~