はじめに
Spring Fest 2020でSpring Initializerを使ったプロジェクトの作成方法が紹介されていました。
これまでSpringBootでの自主開発に挑戦と挫折を繰り返してきましたが、Hello Worldまでたどり着いたのでその記録を残します。
環境
- OS: macOS Mojave 10.14.6
- IDE: Visual Studio Code
下準備
Javaのインストール
HomebrewでJDK11をインストールします。
インストールするだけだと自動でアップデートされてしまうので、バージョンを固定するためにtap
コマンドをはさみます。
$ brew tap AdoptOpenJDK/openjdk
$ brew install --cask adoptopenjdk11
~~
🍺 adoptopenjdk11 was successfully installed!
# brewでインストールしたパッケージにJDKが含まれているか確認
$ brew list
~~ openjdk
# Javaのバージョンを確認
$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1, mixed mode)
# インストールされたディレクトリの場所を確認
$ /usr/libexec/java_home -v 11
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
JAVA_HOME と PATH を設定
# 現在の設定を確認
$ export -p
# 設定追加
$ export JAVA_HOME=`/usr/libexec/java_home -v 11`
$ PATH=${JAVA_HOME}/bin:${PATH}
# 追記されているか確認
$ export -p
declare -x JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home"
declare -x PATH="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin
# sourceコマンドを実行してPATHを通す
$ source ~/.bash_profile
$ which java
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java
・GitHub AdoptOpenJDK - HomeBrew TAP
https://github.com/AdoptOpenJDK/homebrew-openjdk
・Java 11 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする
https://qiita.com/niwasawa/items/460ccd0fa0041e7a2491
Mavenのインストール
同じくbrewでインストールします
$ brew install maven
$ brew list
~~ maven
$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 11.0.9.1, vendor: AdoptOpenJDK, runtime: /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
# setting.xmlを.m2フォルダに移動
$ cp /usr/local/Cellar/maven/3.6.3_1/libexec/conf/settings.xml ~/.m2
Visual Studio Codeの設定
拡張機能のinstall
- Java Extension Pack
(https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) - Spring Boot Extension Pack
(https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack)
それぞれPackという名前の通り色々内包されています。詳細はリンク先まで。
Spring Initializer
Project作成
https://start.spring.io/
以下の内容で「GENERATE」すると、ダウンロードフォルダにzipファイルが格納されます。
VSCodeで開く
File > Open > 展開したフォルダを選択
DemoApplication.javaにmainメソッドが作成されています。
Hello World
Controller
-
/src/main/java/com/example
配下にController
フォルダを作成する -
Controller
フォルダの配下にIndexController.java
を作成する
package com.example.demo.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@GetMapping("/")
public String index(){
return "Hello World";
}
}
実行
MAVEN から clean
, package
, install
Spring boot dashboard から start
or debug
ブラウザでhttp://localhost:8080
をたたく
成功です
Hello World -Thymeleaf
次は文字列ではなくHTMLを返せるように修正します。
pom.xml
dependenciesに以下を追加して再ビルド
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.4.1</version>
</dependency>
Maven repository - Spring Boot Starter Thymeleaf
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf
Controller
package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping("/")
public String index(){
return "index"; //returnするHTMLのファイル名
}
}
HTML
/src/main/resources/templates
にindex.html
を作成
<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org">
<head>
<meta charset="utf-8">
<title>Sample</title>
</head>
<body>
<h1>HelloWorld Thymeleaf</h1>
</body>
</html>
実行
Spring boot dashboard から start
or debug
ブラウザでhttp://localhost:8080
をたたく
成功です
もしも以下のようなエラーが出てしまったら、.m2/repository 配下のフォルダを全て削除して再ビルドを試してみてください。私はしばらくはまってしまったのですがその方法で解決しました。
javax.servlet.ServletException: Circular view path [~]: would dispatch back to the current handler URL [/~] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)