■基本的なプログラムの作成
※IntelliJ IDEA + Spring Boot での開発
IntelliJ IDEAのインストールについては Java.txt を参照
■プロジェクトの作成
Spring Initializr
https://start.spring.io/
今回は以下のように設定する
Dependenciesにある「Spring Web」にはTomcatが付属しているため、Webアプリケーションサーバを用意しなくてもプログラムを動作させることができる
Project: Maven
Language: Java
Spring Boot: 3.0.1(デフォルト、または「SNAPSHOT」や「M1」などが付いていない最新バージョンを選択するといい)
Group: com.example
Artifact: demo
Name: demo
Description: Demo project for Spring Boot
Package name: com.example.demo
Packaging: Jar
Java: 17
Dependencies: Spring Web(「ADD DEPENDENCIES」ボタンから追加する)
設定したら「GENERATE」ボタンをクリックするとZIPファイルがダウンロードできる
これはプロジェクトの雛形なので、展開して適当なフォルダに配置する
今回は「C:\Users\refirio\IdeaProjects\demo」に配置した
IntelliJ IDEA の初期画面で「開く」から上記プロジェクトを開く
(「プロジェクトを信頼して開きますか?」のダイアログが表示されたら、「プロジェクトを信頼」をクリックする)
Mavenにより必要なものがダウンロードされるので、初回の起動は時間がかかる
pom.xml には以下が記述されている
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
main メソッドは src/main/java/com/example/demo/DemoApplication.java にあり、以下が記述されている
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
■コードスタイルの設定
ファイル → 設定 → エディター → コードスタイル → HTML
HTMLのインデントがスペース2つで入力されるため、スペース4に変更した
上記設定上はデフォルトでスペース4となっていたが、そのままOKとすると、次回からスペース4で入力されるようになった
…と思ったが、HTMLファイルの新規作成直後はスペース2つになってしまっている?
ファイルを閉じて再度開くと、設定どおりスペース4つと認識されるみたい?
それでも駄目なら、IntelliJ IDEAを再起動すると認識されるみたい?
■プロジェクトの設定
JDKの設定を行う
メニューバーの「ファイル → プロジェクト構造 → プロジェクト」で、JDKを「17」にする
(デフォルトでそのように設定されていた)
実行構成の設定を行う
メニューバーの「実行 → 実行構成の編集」で、左上の「+」アイコンをクリックし、「アプリケーション」を選択する
名前: Tomcat
SDK: java 17
メインクラス: com.example.demo.DemoApplication
「OK」ボタンを押すと、ツールバーで「現在のファイル」と表示されていたセレクトボックスが「Tomcat」に変わることを確認できる
■プロジェクトの実行
プロジェクトの実行ボタンを押す
実行されると、実行結果として「Spring」のアスキーアートと実行ログが表示される
ログの中に「Tomcat started on port(s): 8080 (http) with context path ''」というメッセージがある
ブラウザで
http://localhost:8080/ にアクセスすると、画面に以下が表示される(エラーとなっているが、表示のためのページを作成していないため)
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Tue Jan 03 17:10:56 JST 2023
There was an unexpected error (type=Not Found, status=404).
プロジェクトを再実行する場合、実行ボタンがあった場所に再実行ボタンが表示されているので押す
「プロセス'Tomcat'は実行中です」と表示されたら、「停止して再実行」でいい
プロジェクトを停止する場合、実行ボタンの右側にある停止ボタンを押す
■プロジェクトの実行エラーと対策
もし以下のメッセージが表示されたら、ポート8080はすでに使用されているために起動できていない
Description:
Web server failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
この場合、src/main/resources/application.properties を開いて以下の内容を記述することで、8888ポートで起動することができる
(他のポート番号を指定することもできる)
server.port = 8888
■エンドポイントの作成と再実行
com.example.demo 内に HomeRestController を作る
HomeRestController.java が作成されるので、以下の内容を記述する
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
public class HomeRestController {
@GetMapping(value = "/")
String index() {
return "Spring Boot";
}
@GetMapping(value = "/now")
String now() {
return "現在時刻は%sです。".formatted(LocalDateTime.now());
}
}
プロジェクトを再実行し、ブラウザで
http://localhost:8080/ にアクセスすると、画面に以下が表示される
Spring Boot
またブラウザで
http://localhost:8080/now にアクセスすると、画面に以下が表示される
現在時刻は2023-01-03T17:22:32.596689400です。
■実行可能なJARファイルを作成
IntelliJ IDEA の画面右端に「Maven」というタブが折りたたまれているので、クリックして表示させる
画面内で「demo → ライフサイクル」内にある「package」を右クリックし、「Mavenビルドの実行」を選択する
実行ウインドウに「BUILD SUCCESS」と表示されれば成功
C:\Users\refirio\IdeaProjects\demo\target 内に「demo-0.0.1-SNAPSHOT.jar」が作成されていることを確認できる
コマンドプロンプトで以下を実行すると、先ほどと同じ画面を表示させることができる
(実行前に、IntelliJ IDEA で実行したものは停止させておく)
java -jar C:\Users\refirio\IdeaProjects\demo\target\demo-0.0.1-SNAPSHOT.jar
プログラムは「Ctrl+C」で終了させることができる
ただしこれは簡易な実行方法で、本番環境ならサービスやNginxを組み合わせて実行することになる
詳細は後述の「Vagrantでアプリケーション(JAR)を起動」を参照
JARファイルについては、後述の「プログラムのパッケージ化について」も参照
■プロパティの上書き(引数)
以下のように起動して、ポート番号を上書き変更できる
src/main/resources/application.properties で指定した値も上書き指定できる
開発環境などで、簡易的に値を変更する場合などに使えそう
java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8888
この場合、以下のようにしてアクセスできる
http://localhost:8888/
http://localhost:8888/task
http://localhost:8888/task_add
Spring-Bootの設定プロパティと環境変数 - Qiita
https://qiita.com/NewGyu/items/d51f527c7199b746c6b6
■プロパティの上書き(src/main/resources/application-xxx.properties)
src/main/resources/application.properties で設定を指定できるが、
src/main/resources/application-production.properties src/main/resources/application-staging.properties のようにファイルを作ることで、環境ごとの設定を指定できる
通常の手順でjarファイルを作成すれば、それを実行する際に以下のようにファイルを指定できる
# java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=production
本番環境のデータベース接続情報などがリポジトリに含むことになるなら微妙かもしれないが、
「本番環境のファイルのみ .gitignore の対象とする」「本番環境はElasticBeanstalkの仕組みに従って別途指定する」
など色々とやりようはありそう
■プロパティの上書き(config/application.properties)
※プログラムをサービスとして稼働させたときは反映されなかった
引き続き要確認
jarファイルと同じ場所に config/application.properties を作成して以下のように書いておくと、起動時に値が上書きされる
本番環境や検収環境で、接続設定などを変更する場合に使えそう
server.port = 8765
spring.datasource.url=jdbc:mysql://localhost:3306/spring-test
spring.datasource.username=test
spring.datasource.password=test1234
起動の際は、以下のとおりファイルのパスなどを指定する必要は無い
java -jar demo-0.0.1-SNAPSHOT.jar
■プロパティの上書き(環境変数)
※プログラムをサービスとして稼働させたときは反映されなかった
引き続き要確認
~/.bash_profile に環境変数として定義(ファイルの最後に追記)しておくと、起動時に値が上書きされる(恒久的な設定になる)
本番環境や検収環境で、接続設定などを変更する場合に使えそう
$ vi ~/.bash_profile
export SERVER_PORT=8888
export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/spring-test
export SPRING_DATASOURCE_USERNAME=test
export SPRING_DATASOURCE_PASSWORD=test1234
設定後、以下で値を反映する
$ source ~/.bash_profile
以下のようにして反映を確認できる
echo $SERVER_PORT
echo $SPRING_DATASOURCE_URL
echo $SPRING_DATASOURCE_USERNAME
echo $SPRING_DATASOURCE_PASSWORD
いまさらですがLinuxで環境変数を設定したい - Qiita
https://qiita.com/chihiro/items/bb687903ee284766e879