お金をかけずにサーバーの勉強をしよう

Spring Boot 3 でWEBアプリを作ってみる

2024年1月5日

メニューへ戻る

Spring Boot 3で Javaの WEBサーバープログラムを作ってみます。

Javaの開発フレームワークとしては既にデファクトスタンダードとなっている Spring Frameworkは、Ver.3 の頃にはもう「XML地獄」と呼ばれた設定ファイルの複雑さがクローズアップされており、それが Spring Fremeworkの敷居の高さになってしまっていました。

Spring Fremework 4 になってからもそれは変わりませんでしたが、その状況を覆す Spring Boot というフレームワークが登場しました。

(比較的)簡単な設定を書くだけで、後は Spring Fremework から必要なものを一通り持ってきてセッティングしてくれるというスグレモノで、Spring Framework への門戸が一気に開かれた気がしました。

現在は Spring Framework は Ver.6 となり、Spring Bootも Ver.3となって、更に進化を遂げております。

ここでは Spring Boot 3を使って Javaの WEBアプリを作ってみようと思います。

併せて Java開発の統合開発環境(IDE)である Apache NetBeansもインストールします。

開発ツールの選定は個々のプログラマの趣味が強く出るので、どれが正解というものでもありませんので、ここに記す内容はそのうちの 1つだと捉えて下さい。
NetBeansを選んでいるのは単に私の趣味です。


1.環境

以下で行きます。

OSLubuntu 22.04.3Ubuntu Desktop 22.04.3と同じです
JavaOpenJDK 21久々に出たLTS版
統合開発環境Apache NetBeans 20このバージョンで Java 21に対応しました
開発フレームワークSpring Boot 3ベースは Spring Framework 6です
ビルドツールApache Maven私の趣味で

これで Spring MVCのテンプレートを使って 1ページ表示するだけの簡単な WEBアプリケーションを作ります。

OpenJDK 21のインストールについては「Java SE Development Kit (JDK) 21 インストール」に書いてありますので、先に入れておいて下さい。


2.Apache NetBeansインストール

Javaの開発と言えば ECLIPSE、更に Spring Frameworkでの開発とくれば ECLIPSEの派生版である STSが人気と思いますが、私は何故だかこれを使っています。

昔はサンマイクロシステムズが作ってたんですが、後を引き継いだ Oracleを経て、現在は APACHE SOFTWARE FOUNDATIONに移管されています。

ダウンロードサイトは以下です。
2024年1月5日時点での最新バージョンは 20です。
Apache NetBeans 20

Lubuntu 22.04.3では NetBeans 20が snapパッケージで配布されていますが、私の環境が悪いのか JDK 21 の環境になってから上手く動かなくなってしまったので、Apacheのサイトから debパッケージをダウンロードしてインストールすることにしました。

以下のサイトに行きます。
Downloading Apache NetBeans 20

コチラがダウンロード対象です。
NetBeans ダウンロード 1

赤枠のリンクをクリックすればダウンロードが始まります。
NetBeans ダウンロード 2

ダウンロードが完了すると [apache-netbeans_20-1_all.deb]ファイルができました。

インストールします。

subro@Lubuntu2204:~$ sudo apt install -y ./ダウンロード/apache-netbeans_20-1_all.deb
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
注意、'./ダウンロード/apache-netbeans_20-1_all.deb' の代わりに 'apache-netbeans' を選択します
以下のパッケージが新たにインストールされます:
  apache-netbeans
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 5 個。
419 MB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 0 B のディスク容量が消費されます。
取得:1 /home/subro/ダウンロード/apache-netbeans_20-1_all.deb apache-netbeans all 20-1 [419 MB]
以前に未選択のパッケージ apache-netbeans を選択しています。
(データベースを読み込んでいます ... 現在 338945 個のファイルとディレクトリがインストールされています。)
.../apache-netbeans_20-1_all.deb を展開する準備をしています ...
apache-netbeans (20-1) を展開しています...
apache-netbeans (20-1) を設定しています ...
desktop-file-utils (0.26-1ubuntu3) のトリガを処理しています ...
hicolor-icon-theme (0.17-2) のトリガを処理しています ...
mailcap (3.70+nmu1ubuntu1) のトリガを処理しています ...
N: ファイル '/home/subro/ダウンロード/apache-netbeans_20-1_all.deb' がユーザ '_apt' からアクセスできないため、ダウンロードは root でサンドボックスを通さずに行われます。 - pkgAcquire::Run (13: Permission denied)

インストールができました。

Lubuntu 22.04.3ではスタートメニューの [プログラミング] のカテゴリにこのようなアイコンができました。
NetBeansアイコン

ダブルクリックしてこんな画面が立ち上がれば OKです。
NetBeans


2.Apache NetBeansの日本語化

英語なので日本語化しましょう。
福岡県在住の Junichi Yamamotoさんが GitHubに日本語化プラグインを公開して下さってますので有り難く頂戴いたします。

ダウンロードはこちら。
junichi11/netbeans-translations-ja

2024年1月5日現在での最新バージョンは 0.0.4 のようですので、「org-apache-netbeans-localise-ja-0.0.4.nbm」というリンクをクリックしてダウンロードして下さい。
NetBeans 日本語化パッチダウンロード 2

ダウンロードが完了すると [org-apache-netbeans-localise-ja-0.0.4.nbm]ファイルができました。

NetBeans(英語)の画面に戻りまして、メニューから [Tools] - [Plugins] を選択します。
NetBeans 日本語化 1

[Plugins]ウィンドウが開きますので [Downloaded]タブを選択し、Add Plugins...を押します。
NetBeans 日本語化 2

ファイル選択ウィンドウが開きますので、ダウンロードしたファイルを指定して、開くを押します。
NetBeans 日本語化 3

日本語化プラグインの内容が表示されますので、左下のInstallを押します。
NetBeans 日本語化 4

Nextを押します。
NetBeans 日本語化 5

ライセンスに同意するなら [I accept the terms in all of the license agreements.] にチェックを入れ、Installを押します。
NetBeans 日本語化 6

自己証明書だからとワーニングが出てしまいました。
作者曰くこのプラグインは、Apache Foundationが日本語化対応するまでの繋ぎだそうなので、今時点ではワーニングは無視してしまいます。
Continueを押します。
NetBeans 日本語化 7

NetBeansの再起動後から日本語化が有効になります。
[Restart IDE Now] を選択し、Finishを押します。
NetBeans 日本語化 8

日本語になりました。これで一安心です。
NetBeans 日本語化 9


これで開発を始めても良いのですが、私は NetBeansがデフォルトで使うフォントが気に入らないので、IPAの日本語フォントをインストールします。

subro@Lubuntu2204:~$ sudo apt install -y fonts-ipaexfont-gothic fonts-ipaexfont-mincho fonts-ipaexfont
〜〜〜 省略 〜〜〜
fontconfig (2.13.1-4.2ubuntu5) のトリガを処理しています ...

フォントキャッシュを最新状態にします。

subro@Lubuntu2204:~$ sudo fc-cache -vr
〜〜〜 省略 〜〜〜
fc-cache: succeeded

IPA日本語フォントが有効になったはずです。

再び NetBeansの画面に戻ります。

メニューから [ツール] - [オプション] を選択します。
NetBeans フォント変更 1

[フォントと色]タブを選択し、[フォント] の...を押します。
NetBeans フォント変更 2

[フォント] に [IPAexゴシック] を選択し、OKを押します。
NetBeans フォント変更 3

OKを押します。
NetBeans フォント変更 4

これでやっと NetBeansの準備ができました。

私は好みでダークモードに変えています。
NetBeans ダークモード


3.Spring Boot 3 のプロジェクト作成

私が Spring Frameworkに出会ったのは、Spring Framework 2の頃で、その頃はまだ米国にあった開発元の Pivotal社のものでしたが、2019年に VMware Workstaion Player開発元の VMware社に買収されました。
そして2022年5月、今度は VMware社が Broadcomという半導体企業に買収されてしまいました。

開発元がこのように変わりはしていますが、Spring Frameworkのバージョンアップは続いており、現在では JAKARTA EEよりも使われているんじゃないかと思える程の勢いがあります。

ここでは Spring Frameworkを使う上で、余りに複雑になってしまった諸々の設定を簡便に使えるようにしてくれた Spring Bootを使って、Apache Maven形式のプロジェクトを作成します。

Spring Bootでプロジェクトを作成するには以下のサイトをご利用下さい。
Spring Initializr

こんな画面のサイトです。 Spring Initializr
以下のように設定しました。
Project: Maven
Language: Java
Spring Boot: 3.2.1 (2024/1/5最新版)
Project Metadata
 Group: org.subro (プロジェクトのルート)
 Artifact: test   (できあがるプロジェクト)
 Name: Test   (プロジェクト名)
 Description: SpringBoot3でWEBアプリ作成 (プロジェクトの説明)
 Package Name: org.subro.test (自動生成:パッケージ名)
 Packaging: Jar (実行可能 Jarファイル)
 Java: 21

Dependencies (利用するライブラリ)
 Spring Web (WEBサーバーアプリ)
 Thymeleaf (テンプレートエンジン)

これで画面左下にあるGENERATEを押すと [test.zip]ファイルがダウンロードされるはずです。

ダウンロードが完了したら、NetBeansの画面に戻ります。

メニューより [ファイル] - [プロジェクトをインポート] - [ZIPから] を選択します。
Netbeans プロジェクト 1

インポート画面が開くので、参照を押します。
Netbeans プロジェクト 2

ファイル選択画面が出ますので、ダウンロードしたファイルを指定し、開くを押します。
Netbeans プロジェクト 3

インポートを押します。
プロジェクトの展開先は [~/NetBeansProjects]ディレクトリ下になります。
Netbeans プロジェクト 4

[プロジェクト]タブの中に Spring Inisializrで作った [test]プロジェクトが現れます。
Netbeans プロジェクト 5

これで NetBeansにプロジェクトを作ることができました。


4.WEBアプリのソース作成

Spring Webのお作法で WEBアプリを作るためにソースファイルを追加していきます。

※Spring Boot 2まで、チュートリアルが Javaで書いてあったのですが、3から Kotlinになってしまいました。
ここでは 2のチュートリアルのものをそのままでやっています。

こちらに例が載ってますので、それを作ってみます。
Serving Web Content with Spring MVC

[ファイル]タブの下のツリーを展開していき、[/test/src/main/java/org/subro/test]で右クリックをしてメニューを出したら、[新規] - [その他] を選択します。
Netbeans プロジェクト 6

[カテゴリ:] に [その他] を、[ファイル・タイプ:] に [空のファイル] を選択し、を押します。
Netbeans プロジェクト 7

[ファイル名]を「GreetingController.java」として、終了を押します。
Netbeans プロジェクト 8

[GreetingController.java]ファイルの編集タブが出来ますので、上記の例のソースを貼ってやります。
[/greeting] というエンドポイントにアクセスした際に実行されるコントローラークラスですね。
太字の箇所は当プロジェクトに合わせてオリジナルから変えています。

package org.subro.test;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class GreetingController {

	@GetMapping("/greeting")
	public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
		model.addAttribute("name", name);
		return "greeting";
	}

}

まだ Spring Framework のライブラリをダウンロードしていないのでワーニングが出ていますが、無視します。
Netbeans プロジェクト 9

同様に [ファイル]タブの下のツリーを展開していき、[/test/src/mian/resources/templetes] で右クリックをしてメニューを出したら、[新規] - [その他] を選択します。
Netbeans プロジェクト 10

[カテゴリ:] に [その他] を、[ファイル・タイプ:] に [HTMLファイル] を選択し、を押します。
Netbeans プロジェクト 11

拡張子「.html」は自動で付与されますので、[ファイル名:] は「greeting」として、終了を押します。
Netbeans プロジェクト 12

先程と同様に [greeting.html]ファイルを以下の内容に書き換えます。
Thymeleafテンプレートの書式に従った記載になっています。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p th:text="'Hello, ' + ${name} + '!'" />
</body>
</html>

Thymeleaf独自のタグ部分(th:)はどうしてもワーニングになってしまいますが無視します。
Netbeans プロジェクト 13

これでソースプログラムは完成です。


5.プロジェクトのビルド

ビルド(コンパイルして実行プログラムを作成すること)をします。

カナヅチのボタンを押します。
Netbeans プロジェクト 14

すると NetBeansの画面の右下に
Cannot run program "/home/subro/NetBeansProjects/test/mvnw" (in directory "/home/subro/NetBeansProjects/test"): error=13, Permission denied
のようなエラーが出て失敗しています。

「mvnw」が何かと思えば、Apache Mavenのビルドコマンドである mvnのラッパースクリプトのようで、これが実行できないと言っています。
調べてみると、実行権限がついていませんでした。

subro@Lubuntu2204:~/NetBeansProjects/test$ ls -l
total 32
-rw-rw-r-- 1 subro subro  1075  1月  5 13:08 HELP.md
-rw-rw-r-- 1 subro subro 11290  1月  5 13:08 mvnw
-rw-rw-r-- 1 subro subro  7592  1月  5 13:08 mvnw.cmd
-rw-rw-r-- 1 subro subro  1364  1月  5 13:08 pom.xml
drwxrwxr-x 4 subro subro  4096  1月  5 13:21 src

[mvnw]ファイルに実行権限を付けます。

subro@Lubuntu2204:~/NetBeansProjects/test$ chmod u+x mvnw

subro@Lubuntu2204:~/NetBeansProjects/test$ ls -l
total 32
-rw-rw-r-- 1 subro subro  1075  1月  5 13:08 HELP.md
-rwxrw-r-- 1 subro subro 11290  1月  5 13:08 mvnw
-rw-rw-r-- 1 subro subro  7592  1月  5 13:08 mvnw.cmd
-rw-rw-r-- 1 subro subro  1364  1月  5 13:08 pom.xml
drwxrwxr-x 4 subro subro  4096  1月  5 13:21 src

実行権限が付きました。

改めてカナヅチボタンでビルドします。

今度は上手くいっているようです。
Spring Framework 6の諸々のモジュールをダウンロードするので、初回のみ結構時間がかかります。

画面右下にビルドが完了したメッセージが出ました。
Netbeans プロジェクト 15

プロジェクトのビルドができました。


6.作成した WEBサーバープログラムの実行

実行してみます。

[ファイル]タブで、トップの [Test]ディレクトリを選んでやります。
そうすると、[緑色の三角ボタン](Playボタン)が押せるようになっているので、押します。
Netbeans プロジェクト 16

ビルドツールの Mavenにより Mavenのリポジトリから関連のライブラリをダウンロードしてきます。
画面右下にビルドのログが流れ、ちょっと時間がかかります。

ダウンロードしたライブラリファイルは [~/.m2]ディレクトリ以下にキャッシュされて、2回目以降のビルドが速くなります。

Mavenリポジトリにあるライブラリは MAVEN REPOSITORYで検索できます。

…途中でエラーになりました。

エラー: メイン・クラス${start-class}を検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: ${start-class}
Command execution failed.

これは Jarファイルを実行するときに、マニフェストファイルでどのクラスにある mainメソッドを実行するか指定していない場合に起きるやつです。
どうすれば良いんでしょうか。

Mavenプロジェクトのプロジェクトの設定があって、[pom.xml]と言います。

これの タグの中に以下の行(タグ)を追加します。
[TestApplication]クラスの [main]メソッドを最初に実行するようにしてくれます。

<start-class>org.subro.test.TestApplication</start-class>

Netbeans プロジェクト 17

再度 [緑色の三角ボタン] を押します。

今度は実行されました。
こんなコンソールメッセージが出ます。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.1)

2024-01-05T14:12:40.642+09:00  INFO 4830 --- [           main] org.subro.test.TestApplication           : Starting TestApplication using Java 21.0.1 with PID 4830 (/home/subro/NetBeansProjects/test/target/classes started by subro in /home/subro/NetBeansProjects/test)
2024-01-05T14:12:40.644+09:00  INFO 4830 --- [           main] org.subro.test.TestApplication           : No active profile set, falling back to 1 default profile: "default"
2024-01-05T14:12:41.708+09:00  INFO 4830 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-01-05T14:12:41.722+09:00  INFO 4830 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-01-05T14:12:41.722+09:00  INFO 4830 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.17]
2024-01-05T14:12:41.772+09:00  INFO 4830 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-01-05T14:12:41.773+09:00  INFO 4830 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1088 ms
2024-01-05T14:12:42.153+09:00  INFO 4830 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path ''
2024-01-05T14:12:42.161+09:00  INFO 4830 --- [           main] org.subro.test.TestApplication

8080/tcpで待っているようなので、WEBブラウザでアクセスしてみます。
私の環境では [http://localhost:8080/geeting] です。
Netbeans プロジェクト 18

ちゃんと挨拶のレスポンスがあって、WEBサーバーとして動いていることが分かります。

Tomcatはどこで動いてるの?と思う方がいらっしゃるかもしれませんが、Spring Bootで WEBサーバープログラムを作るとできあがりの JARファイルの中に Tomcatが含まれています

Tomcatなどのサーブレットエンジンのミドルウェアなしに、Javaさえ動く環境なら JARファイル 1つあれば WEBサーバープログラムが実行できるのです。
これは凄いなと思いましたね。

プログラムの停止はこちらのボタンを押して下さい。
Netbeans プロジェクト 19


==========
さて、Spring Boot 3はどうでしょうか。 結構簡単に WEBサーバープログラムができてしまいました。

私はプログラマではないのですが、それでも作れてしまう。
そしてここまで全部タダってのがまたすごい。

そして JARファイル 1つで、Javaが動くところならどこでも動く(はず)なのがポイントかと思います。

サーバーインフラの観点からは、サーバーのスケールアウト時の環境構成がすごく楽です。
パプリッククラウドなどで自動スケールアウトをする機能を使う場合に「あぁ楽だ!」って思うかも知れませんね。


Spring Boot 3の日本語書籍は徐々に出てきました。