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.環境
以下で行きます。
OS | Lubuntu 22.04.3 | Ubuntu Desktop 22.04.3と同じです |
Java | OpenJDK 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
コチラがダウンロード対象です。
赤枠のリンクをクリックすればダウンロードが始まります。
ダウンロードが完了すると [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ではスタートメニューの [プログラミング] のカテゴリにこのようなアイコンができました。
ダブルクリックしてこんな画面が立ち上がれば OKです。
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」というリンクをクリックしてダウンロードして下さい。
ダウンロードが完了すると [org-apache-netbeans-localise-ja-0.0.4.nbm]ファイルができました。
NetBeans(英語)の画面に戻りまして、メニューから [Tools] - [Plugins] を選択します。
[Plugins]ウィンドウが開きますので [Downloaded]タブを選択し、Add Plugins...を押します。
ファイル選択ウィンドウが開きますので、ダウンロードしたファイルを指定して、開くを押します。
日本語化プラグインの内容が表示されますので、左下のInstallを押します。
Nextを押します。
ライセンスに同意するなら [I accept the terms in all of the license agreements.] にチェックを入れ、Installを押します。
自己証明書だからとワーニングが出てしまいました。
作者曰くこのプラグインは、Apache Foundationが日本語化対応するまでの繋ぎだそうなので、今時点ではワーニングは無視してしまいます。
Continueを押します。
NetBeansの再起動後から日本語化が有効になります。
[Restart IDE Now] を選択し、Finishを押します。
日本語になりました。これで一安心です。
これで開発を始めても良いのですが、私は 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の画面に戻ります。
メニューから [ツール] - [オプション] を選択します。
[フォントと色]タブを選択し、[フォント] の...を押します。
[フォント] に [IPAexゴシック] を選択し、OKを押します。
OKを押します。
これでやっと 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
こんな画面のサイトです。
以下のように設定しました。
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から] を選択します。
インポート画面が開くので、参照を押します。
ファイル選択画面が出ますので、ダウンロードしたファイルを指定し、開くを押します。
インポートを押します。
プロジェクトの展開先は [~/NetBeansProjects]ディレクトリ下になります。
[プロジェクト]タブの中に Spring Inisializrで作った [test]プロジェクトが現れます。
これで NetBeansにプロジェクトを作ることができました。
4.WEBアプリのソース作成
Spring Webのお作法で WEBアプリを作るためにソースファイルを追加していきます。
こちらに例が載ってますので、それを作ってみます。
Serving Web Content with Spring MVC
[ファイル]タブの下のツリーを展開していき、[/test/src/main/java/org/subro/test]で右クリックをしてメニューを出したら、[新規] - [その他] を選択します。
[カテゴリ:] に [その他] を、[ファイル・タイプ:] に [空のファイル] を選択し、次を押します。
[ファイル名]を「GreetingController.java」として、終了を押します。
[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 のライブラリをダウンロードしていないのでワーニングが出ていますが、無視します。
同様に [ファイル]タブの下のツリーを展開していき、[/test/src/mian/resources/templetes] で右クリックをしてメニューを出したら、[新規] - [その他] を選択します。
[カテゴリ:] に [その他] を、[ファイル・タイプ:] に [HTMLファイル] を選択し、次を押します。
拡張子「.html」は自動で付与されますので、[ファイル名:] は「greeting」として、終了を押します。
先程と同様に [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:)はどうしてもワーニングになってしまいますが無視します。
これでソースプログラムは完成です。
5.プロジェクトのビルド
ビルド(コンパイルして実行プログラムを作成すること)をします。
カナヅチのボタンを押します。
すると 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の諸々のモジュールをダウンロードするので、初回のみ結構時間がかかります。
画面右下にビルドが完了したメッセージが出ました。
プロジェクトのビルドができました。
6.作成した WEBサーバープログラムの実行
実行してみます。
[ファイル]タブで、トップの [Test]ディレクトリを選んでやります。
そうすると、[緑色の三角ボタン](Playボタン)が押せるようになっているので、押します。
ビルドツールの 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>
再度 [緑色の三角ボタン] を押します。
今度は実行されました。
こんなコンソールメッセージが出ます。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: 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] です。
ちゃんと挨拶のレスポンスがあって、WEBサーバーとして動いていることが分かります。
Tomcatはどこで動いてるの?と思う方がいらっしゃるかもしれませんが、Spring Bootで WEBサーバープログラムを作るとできあがりの JARファイルの中に Tomcatが含まれています。
Tomcatなどのサーブレットエンジンのミドルウェアなしに、Javaさえ動く環境なら JARファイル 1つあれば WEBサーバープログラムが実行できるのです。
これは凄いなと思いましたね。
プログラムの停止はこちらのボタンを押して下さい。
==========
さて、Spring Boot 3はどうでしょうか。
結構簡単に WEBサーバープログラムができてしまいました。
私はプログラマではないのですが、それでも作れてしまう。
そしてここまで全部タダってのがまたすごい。
そして JARファイル 1つで、Javaが動くところならどこでも動く(はず)なのがポイントかと思います。
サーバーインフラの観点からは、サーバーのスケールアウト時の環境構成がすごく楽です。
パプリッククラウドなどで自動スケールアウトをする機能を使う場合に「あぁ楽だ!」って思うかも知れませんね。
Spring Boot 3の日本語書籍は徐々に出てきました。