こんにちは
先週は「テキストノードの操作」について紹介しましたが、
今週のテーマは「SpringBootを完全に理解する1」です
久しく触っていなかったが、
最近のJavaがどうなってるのか調べてみた。
- AltJava
- Groovy
- Scala
- Kotlin
- Javaのバージョン
- 8 or 11
- フレームワーク
- SpringBoot (Tomcat組込)
- ビルドツール:
- Gradle
- ORM
- JPA
- テンプレートエンジン
- Thymeleaf
- Mustache
- IDE
- Spring Tools Suite (STS)
- VSCode
- Atom
- コンテナ?
- JVMは重量級なのでコンテナ向きじゃないのかも
- 最近コンテナ技術に最適化されたQuarkusが登場したので一気に置き換わりそう
SpringBootでローカルの開発環境を作ってみる。
1.前提
WindowsでCLIでdockerを動かせる状態になっていること。
2.ミドルウェア構成
- mysql等はdockerコンテナ上で動かす
- JVM(SpringBoot)はコンテナ化すると重そうなのでホスト側で行う
SpringBoootの開発ではSTSを使うとよい。
(しかしEclipse嫌いなのでVSCodeで行くことにした)
3.手順
まず、Spring Initializrで最小構成のスターターファイルをダウンロードする。
https://start.spring.io/ ;
利用するライブラリを選ぶとzipにしてダウンロードできるので適当にこんな感じ。
- DevTools
- Web
- Thymeleaf
- JPA
- MySQL
- JDBC
あとで追加したい場合は`biuld.gradle`の依存を修正すればいい。
(ちなみにSTSならわざわざダウンロードしなくても新規プロジェクト作成時に対話式で選択できる)
Javaはscoopでopenjdkをインストールした
```bash
$ scoop install openjdk
$ java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
```
作業ディレクトリ
```bash
$ mkdir -p repos/springboot-demo
$ cd repos/springboot-demo
```
Spring Initializrからダウンロード
```bash
$ wget -O demo.zip "https://start.spring.io/starter.zip?name=demo&groupId=jp.co.stylagy&artifactId=demo&version=0.0.1-SNAPSHOT&; \
description=Demo+project+for+Spring+Boot&packageName=jp.co.stylagy.demo&type=gradle-project&packaging=jar&javaVersion=11&language=java& \
bootVersion=2.2.0.BUILD-SNAPSHOT&dependencies=devtools&dependencies=data-jpa&dependencies=mysql&dependencies=jdbc&dependencies=thymeleaf&dependencies=web"
- --2019-03-27 10:44:38-- https://start.spring.io/starter.zip?name=demo&groupId=jp.co.stylagy&artifactId=demo&version=0.0.1-SNAPSHOT&; \
description=Demo+project+for+Spring+Boot&packageName=jp.co.stylagy.demo&type=gradle-project&packaging=jar&javaVersion=11&language=java& \
bootVersion=2.2.0.BUILD-SNAPSHOT&dependencies=devtools&dependencies=data-jpa&dependencies=mysql&dependencies=jdbc&dependencies=thymeleaf&dependencies=web
start.spring.io (start.spring.io) をDNSに問いあわせています... 104.20.5.247, 104.20.6.247
start.spring.io (start.spring.io)|104.20.5.247|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 57921 (57K) [application/zip]
`demo.zip' に保存中
demo.zip 100%============================================================================>] 56.56K 320KB/s 時間 0.2s
2019-03-27 10:44:40 (320 KB/s) - `demo.zip' へ保存完了 [57921/57921]
```
展開する
```bash
$ unzip demo.zip
Archive: demo.zip
inflating: gradlew
creating: gradle/
creating: gradle/wrapper/
・・・
・・・
・・・
inflating: src/test/java/jp/co/stylagy/demo/DemoApplicationTests.java
```
git管理しておく
```bash
$ rm demo.zip
$ git init
$ git add .
$ git commit -m "initial commit"
```
ビルド(初回はライブラリのDLに時間がかかる)
```bash
$ ./gradlew build
> Task :test
jp.co.stylagy.demo.DemoApplicationTests > contextLoads FAILED
java.lang.IllegalStateException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.BeanCreationException
Caused by: org.springframework.beans.BeanInstantiationException
Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException
1 test completed, 1 failed
> Task :test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///C:/msys64/home/Stylagy12/repos/springboot-demo/build/reports/tests/test/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org ;
BUILD FAILED in 35s
5 actionable tasks: 5 executed
```
テストでコケたので`build.gradle`を修正して一旦DBなしで動かす
```diff
--- a/build.gradle
+++ b/build.gradle
@@ -16,11 +16,11 @@ repositories {
}
dependencies {
- implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
- implementation 'org.springframework.boot:spring-boot-starter-jdbc'
+ // implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+ // implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'org.springframework.boot:spring-boot-devtools'
- runtimeOnly 'mysql:mysql-connector-java'
+ // runtimeOnly 'mysql:mysql-connector-java'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
```
もう一度ビルドしたら今度は成功
```bash
$ ./gradlew build
> Task :test
2019-03-27 10:58:10.940 INFO 5400 --- [ Thread-5] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
BUILD SUCCESSFUL in 10s
5 actionable tasks: 4 executed, 1 up-to-date
```
サーバー起動(止めるときは`Ctrl + c`)
```bash
$ ./gradlew bootRun
> Task :bootRun
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.0.BUILD-SNAPSHOT)
2019-03-27 11:01:48.432 INFO 10076 --- [ restartedMain] jp.co.stylagy.demo.DemoApplication : Starting DemoApplication on ・・・
2019-03-27 11:01:48.445 INFO 10076 --- [ restartedMain] jp.co.stylagy.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-03-27 11:01:48.495 INFO 10076 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
・・・
・・・
・・・
2019-03-27 11:01:50.279 INFO 10076 --- [ restartedMain] jp.co.stylagy.demo.DemoApplication : Started DemoApplication in 2.25 seconds (JVM running for 2.72)
<=========----> 75% EXECUTING [12s]
> :bootRun
```
ブラウザでページを確認
```bash
$ start http://localhost:8080/ ;
```
404エラーページが表示される
なぜならまだ何もページを作成してないからだ
ということでindexを作成する
src/main/java/jp/co/stylagy/demo/IndexController.java
```java
package jp.co.stylagy.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@RequestMapping("/")
public String index() {
return "Hello World";
}
}
```
ブラウザでページを確認
```bash
$ ./gradlew build
$ ./gradlew bootDev
$ start http://localhost:8080/ ;
```
※`org.springframework.boot:spring-boot-devtools`を組み込んでいれば、エディタ側で自動ビルド設定しておくとコードの変更時に自動的にサーバを再起動してくれるので便利だ。
VSCodeのプラグインはデフォルトで`bin`ディレクトリに出力するようなので`.classpath`を修正して`build`ディレクトリに出力するようにしておくとよい
無事に表示された。
次回はテンプレートエンジンを使用するところから紹介します
それではまた