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

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

2022年8月16日

メニューへ戻る


Java界隈では大変有名になった Spring Framework ですが、Ver.3の頃にはもう「XML地獄」と呼ばれた設定ファイルの複雑さがクローズアップされており、それが Spring Fremeworkの敷居の高さになってしまっていました。

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

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

現在は、Spring Framework は Ver.5 となり、Spring Boot も Ver.2 となって、ますますこなれてきた感があります。

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

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

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

ここでは私の趣味で以下のものを使ってやってみます。

環境は、Ubuntu Desktop 22.04 ・ OpenJDK17 です。

私は Lubuntu 22.04を使っているので、画面回りがちょっと違うところはご容赦願います。
それ以外の大事な所は変わらないと思いますので。

では行きましょう。


Apache NetBeans

Javaの開発と言えば ECLIPSE、更に Spring Frameworkでの開発とくれば ECLIPSEの派生版である STSが人気と思いますが、私は何故だかこれを使っています。
昔はサンマイクロシステムズが作ってたんですが、後を引き継いだ Oracleを経て、現在は APACHE SOFTWARE FOUNDATIONに移管されています。

Apache NetBeans 14

ダウンロードサイトは以下です。
2022年8月16日時点での最新バージョンは 14です。

Downloading Apache NetBeans 14

[Apache-NetBeans-14-bin-linux-x64.sh]というリンクからダウンロードできます。
ダウンロードが完了すると、Apache-NetBeans-14-bin-linux-x64.sh というファイルができました。

Netbeans14は Javaで作られているツールですので Javaが必要です。
ここではインストールのために安定版の Java17を使います(Java18環境ではインストールに失敗しました)が、開発自体は他のバージョンでもできるはずです。

subro@Ubuntu2204:~$ sudo apt install openjdk-17-jdk
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  ca-certificates-java openjdk-17-jdk-headless openjdk-17-jre openjdk-17-jre-headless
提案パッケージ:
  openjdk-17-demo openjdk-17-source visualvm fonts-ipafont-gothic fonts-ipafont-mincho fonts-wqy-microhei | fonts-wqy-zenhei
以下のパッケージが新たにインストールされます:
  ca-certificates-java openjdk-17-jdk openjdk-17-jdk-headless openjdk-17-jre openjdk-17-jre-headless
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
267 MB のアーカイブを取得する必要があります。
この操作後に追加で 417 MB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-17-jre-headless amd64 17.0.4+8-1~22.04 [47.7 MB]
取得:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 ca-certificates-java all 20190909 [12.1 kB]
取得:3 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-17-jre amd64 17.0.4+8-1~22.04 [180 kB]
取得:4 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-17-jdk-headless amd64 17.0.4+8-1~22.04 [215 MB]
取得:5 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 openjdk-17-jdk amd64 17.0.4+8-1~22.04 [4,518 kB]
267 MB を 37秒 で取得しました (7,257 kB/s)
以前に未選択のパッケージ openjdk-17-jre-headless:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 314458 個のファイルとディレクトリがインストールされています。)
.../openjdk-17-jre-headless_17.0.4+8-1~22.04_amd64.deb を展開する準備をしています ...
openjdk-17-jre-headless:amd64 (17.0.4+8-1~22.04) を展開しています...
以前に未選択のパッケージ ca-certificates-java を選択しています。
.../ca-certificates-java_20190909_all.deb を展開する準備をしています ...
ca-certificates-java (20190909) を展開しています...
以前に未選択のパッケージ openjdk-17-jre:amd64 を選択しています。
.../openjdk-17-jre_17.0.4+8-1~22.04_amd64.deb を展開する準備をしています ...
openjdk-17-jre:amd64 (17.0.4+8-1~22.04) を展開しています...
以前に未選択のパッケージ openjdk-17-jdk-headless:amd64 を選択しています。
.../openjdk-17-jdk-headless_17.0.4+8-1~22.04_amd64.deb を展開する準備をしています ...
openjdk-17-jdk-headless:amd64 (17.0.4+8-1~22.04) を展開しています...
以前に未選択のパッケージ openjdk-17-jdk:amd64 を選択しています。
.../openjdk-17-jdk_17.0.4+8-1~22.04_amd64.deb を展開する準備をしています ...
openjdk-17-jdk:amd64 (17.0.4+8-1~22.04) を展開しています...
openjdk-17-jre-headless:amd64 (17.0.4+8-1~22.04) を設定しています ...
update-alternatives: /usr/bin/java (java) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/java を使います
update-alternatives: /usr/bin/jpackage (jpackage) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jpackage を使います
update-alternatives: /usr/bin/keytool (keytool) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/keytool を使います
update-alternatives: /usr/bin/rmiregistry (rmiregistry) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/rmiregistry を使います
update-alternatives: /usr/bin/jexec (jexec) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/lib/jexec を使います
ca-certificates-java (20190909) を設定しています ...
openjdk-17-jre:amd64 (17.0.4+8-1~22.04) を設定しています ...
openjdk-17-jdk-headless:amd64 (17.0.4+8-1~22.04) を設定しています ...
update-alternatives: /usr/bin/jar (jar) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jar を使います
update-alternatives: /usr/bin/jarsigner (jarsigner) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jarsigner を使います
update-alternatives: /usr/bin/javac (javac) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/javac を使います
update-alternatives: /usr/bin/javadoc (javadoc) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/javadoc を使います
update-alternatives: /usr/bin/javap (javap) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/javap を使います
update-alternatives: /usr/bin/jcmd (jcmd) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jcmd を使います
update-alternatives: /usr/bin/jdb (jdb) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jdb を使います
update-alternatives: /usr/bin/jdeprscan (jdeprscan) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jdeprscan を使います
update-alternatives: /usr/bin/jdeps (jdeps) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jdeps を使います
update-alternatives: /usr/bin/jfr (jfr) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jfr を使います
update-alternatives: /usr/bin/jimage (jimage) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jimage を使います
update-alternatives: /usr/bin/jinfo (jinfo) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jinfo を使います
update-alternatives: /usr/bin/jlink (jlink) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jlink を使います
update-alternatives: /usr/bin/jmap (jmap) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jmap を使います
update-alternatives: /usr/bin/jmod (jmod) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jmod を使います
update-alternatives: /usr/bin/jps (jps) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jps を使います
update-alternatives: /usr/bin/jrunscript (jrunscript) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jrunscript を使います
update-alternatives: /usr/bin/jshell (jshell) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jshell を使います
update-alternatives: /usr/bin/jstack (jstack) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jstack を使います
update-alternatives: /usr/bin/jstat (jstat) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jstat を使います
update-alternatives: /usr/bin/jstatd (jstatd) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jstatd を使います
update-alternatives: /usr/bin/serialver (serialver) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/serialver を使います
update-alternatives: /usr/bin/jhsdb (jhsdb) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jhsdb を使います
openjdk-17-jdk:amd64 (17.0.4+8-1~22.04) を設定しています ...
update-alternatives: /usr/bin/jconsole (jconsole) を提供するために自動モードで /usr/lib/jvm/java-17-openjdk-amd64/bin/jconsole を使います
ca-certificates (20211016) のトリガを処理しています ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

done.
done.
mailcap (3.70+nmu1ubuntu1) のトリガを処理しています ...
desktop-file-utils (0.26-1ubuntu3) のトリガを処理しています ...
hicolor-icon-theme (0.17-2) のトリガを処理しています ...

結構色々入りました。

途中で、Ubuntuに用意されている alternatives という機能で、複数の Javaを相乗りさせられるようにセッティングしてくれています。
この環境では、OpenJDK17がデフォルトの Javaとなりました。


では、先程ダウンロードしておいた Netbeans14 をインストールします。

subro@Ubuntu2204:~/ダウンロード$ ls -l
-rwxrwxrwx 1 subro subro 449449984  8月 16 08:20 Apache-NetBeans-14-bin-linux-x64.sh

subro@Ubuntu2204:~/ダウンロード$ sudo bash ./Apache-NetBeans-14-bin-linux-x64.sh
Configuring the installer...
Searching for JVM on the system...
Extracting installation data...
Running the installer wizard...

ここから GUIのインストーラーが立ち上がります。

Nextを押します。
NetBeansインストール 1

[I accept the terms in the license agreement]にチェックを入れ、Nextを押します。
NetBeansインストール 2

Netbeansのインストール先(上の段)はそのまま、JDKのインストール場所(下の段)は、「/usr/lib/jvm/java-17-openjdk-amd64」とします。
Nextを押します。
NetBeansインストール 3

このままInstallを押します。
NetBeansインストール 4

待ちます。
NetBeansインストール 5

Finishを押します。
NetBeansインストール 6

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

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

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

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

2022年8月16日現在での最新バージョンは、0.0.3 のようですので、「org-apache-netbeans-localise-ja-0.0.3.nbm」というリンクをクリックしてダウンロードして下さい。

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

これを NetBeans14の個人用のディレクトリに移動しておきます。
場所は、~/.netbeans/14 です。

subro@Ubuntu2204:~/ダウンロード$ ls -l org-apache-netbeans-localise-ja-0.0.3.nbm
-rw-rw-r-- 1 subro subro 4897650  8月 16 08:21 org-apache-netbeans-localise-ja-0.0.3.nbm

subro@Ubuntu2204:~/ダウンロード$ mv org-apache-netbeans-localise-ja-0.0.3.nbm ~/.netbeans/14

subro@Ubuntu2204:~/ダウンロード$ ls -l ~/.netbeans/14/org-apache-netbeans-localise-ja-0.0.3.nbm
-rw-rw-r-- 1 subro subro 4897650  8月 16 08:21 /home/subro/.netbeans/14/org-apache-netbeans-localise-ja-0.0.3.nbm

ファイルの移動が済んだら、NetBeansの画面に戻ります。

メニューから[Tools]-[Plugins]と選択します。
NetBeans日本語化 1

このような画面になりますので、[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

Continueを押します。
NetBeans日本語化 7

Finishを押すと、NetBeansが再起動します。
NetBeans日本語化 8

日本語になりました。\(^o^)/
NetBeans日本語化 9


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

subro@Ubuntu2204:~$ sudo apt install fonts-ipaexfont-gothic fonts-ipaexfont-mincho fonts-ipaexfont
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  fonts-ipaexfont fonts-ipaexfont-gothic fonts-ipaexfont-mincho
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
7,954 kB のアーカイブを取得する必要があります。
この操作後に追加で 14.1 MB のディスク容量が消費されます。
取得:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-ipaexfont-gothic all 00401-3ubuntu1 [3,341 kB]
取得:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-ipaexfont-mincho all 00401-3ubuntu1 [4,604 kB]
取得:3 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-ipaexfont all 00401-3ubuntu1 [8,428 B]
7,954 kB を 3秒 で取得しました (2,430 kB/s)
以前に未選択のパッケージ fonts-ipaexfont-gothic を選択しています。
(データベースを読み込んでいます ... 現在 314894 個のファイルとディレクトリがインストールされています。)
.../fonts-ipaexfont-gothic_00401-3ubuntu1_all.deb を展開する準備をしています ...
fonts-ipaexfont-gothic (00401-3ubuntu1) を展開しています...
以前に未選択のパッケージ fonts-ipaexfont-mincho を選択しています。
.../fonts-ipaexfont-mincho_00401-3ubuntu1_all.deb を展開する準備をしています ...
fonts-ipaexfont-mincho (00401-3ubuntu1) を展開しています...
以前に未選択のパッケージ fonts-ipaexfont を選択しています。
.../fonts-ipaexfont_00401-3ubuntu1_all.deb を展開する準備をしています ...
fonts-ipaexfont (00401-3ubuntu1) を展開しています...
fonts-ipaexfont-mincho (00401-3ubuntu1) を設定しています ...
update-alternatives: /usr/share/fonts/truetype/fonts-japanese-mincho.ttf (fonts-japanese-mincho.ttf) を提供するために自動モードで /usr/share/fonts/opentype/ipaexfont-mincho/ipaexm.ttf を使います
fonts-ipaexfont-gothic (00401-3ubuntu1) を設定しています ...
update-alternatives: /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) を提供するために自動モードで /usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf を使います
fonts-ipaexfont (00401-3ubuntu1) を設定しています ...
fontconfig (2.13.1-4.2ubuntu5) のトリガを処理しています ...

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

subro@Ubuntu2204:~$ sudo fc-cache -vr
/usr/share/fonts: caching, new cache contents: 0 fonts, 6 dirs
/usr/share/fonts/X11: caching, new cache contents: 0 fonts, 4 dirs
/usr/share/fonts/X11/Type1: caching, new cache contents: 43 fonts, 0 dirs
/usr/share/fonts/X11/encodings: caching, new cache contents: 0 fonts, 1 dirs
/usr/share/fonts/X11/encodings/large: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/X11/misc: caching, new cache contents: 149 fonts, 0 dirs
/usr/share/fonts/X11/util: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/cMap: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/cmap: caching, new cache contents: 0 fonts, 5 dirs
/usr/share/fonts/cmap/adobe-cns1: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/cmap/adobe-gb1: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/cmap/adobe-japan1: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/cmap/adobe-japan2: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/cmap/adobe-korea1: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/opentype: caching, new cache contents: 0 fonts, 5 dirs
/usr/share/fonts/opentype/ipaexfont-gothic: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/opentype/ipaexfont-mincho: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/opentype/malayalam: caching, new cache contents: 7 fonts, 0 dirs
/usr/share/fonts/opentype/noto: caching, new cache contents: 30 fonts, 0 dirs
/usr/share/fonts/opentype/urw-base35: caching, new cache contents: 35 fonts, 0 dirs
/usr/share/fonts/truetype: caching, new cache contents: 2 fonts, 49 dirs
/usr/share/fonts/truetype/Gargi: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/Gubbi: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/Nakula: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/Navilu: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/Sahadeva: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/Sarai: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/abyssinica: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/ancient-scripts: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/dejavu: caching, new cache contents: 22 fonts, 0 dirs
/usr/share/fonts/truetype/droid: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-beng-extra: caching, new cache contents: 6 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-deva-extra: caching, new cache contents: 3 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-gujr-extra: caching, new cache contents: 5 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-guru-extra: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-kalapi: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-orya-extra: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-telu-extra: caching, new cache contents: 2 fonts, 0 dirs
/usr/share/fonts/truetype/fonts-yrsa-rasa: caching, new cache contents: 15 fonts, 0 dirs
/usr/share/fonts/truetype/freefont: caching, new cache contents: 12 fonts, 0 dirs
/usr/share/fonts/truetype/hack: caching, new cache contents: 4 fonts, 0 dirs
/usr/share/fonts/truetype/kacst: caching, new cache contents: 15 fonts, 0 dirs
/usr/share/fonts/truetype/kacst-one: caching, new cache contents: 2 fonts, 0 dirs
/usr/share/fonts/truetype/lao: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/liberation: caching, new cache contents: 16 fonts, 0 dirs
/usr/share/fonts/truetype/liberation2: caching, new cache contents: 12 fonts, 0 dirs
/usr/share/fonts/truetype/libreoffice: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-assamese: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-bengali: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-devanagari: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-gujarati: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-kannada: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-malayalam: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-oriya: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-punjabi: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-tamil: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-tamil-classical: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/lohit-telugu: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/malayalam: caching, new cache contents: 10 fonts, 0 dirs
/usr/share/fonts/truetype/noto: caching, new cache contents: 3 fonts, 0 dirs
/usr/share/fonts/truetype/padauk: caching, new cache contents: 4 fonts, 0 dirs
/usr/share/fonts/truetype/pagul: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/samyak: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/samyak-fonts: caching, new cache contents: 3 fonts, 0 dirs
/usr/share/fonts/truetype/sinhala: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/teluguvijayam: caching, new cache contents: 20 fonts, 0 dirs
/usr/share/fonts/truetype/tibetan-machine: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/tlwg: caching, new cache contents: 58 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-khmeros-core: caching, new cache contents: 2 fonts, 0 dirs
/usr/share/fonts/truetype/ubuntu: caching, new cache contents: 14 fonts, 0 dirs
/usr/share/fonts/type1: caching, new cache contents: 0 fonts, 2 dirs
/usr/share/fonts/type1/gsfonts: caching, new cache contents: 35 fonts, 0 dirs
/usr/share/fonts/type1/urw-base35: caching, new cache contents: 35 fonts, 0 dirs
/usr/local/share/fonts: caching, new cache contents: 0 fonts, 0 dirs
/root/.local/share/fonts: skipping, no such directory
/root/.fonts: skipping, no such directory
/usr/share/fonts/X11: skipping, looped directory detected
/usr/share/fonts/cMap: skipping, looped directory detected
/usr/share/fonts/cmap: skipping, looped directory detected
/usr/share/fonts/opentype: skipping, looped directory detected
/usr/share/fonts/truetype: skipping, looped directory detected
/usr/share/fonts/type1: skipping, looped directory detected
/usr/share/fonts/X11/Type1: skipping, looped directory detected
/usr/share/fonts/X11/encodings: skipping, looped directory detected
/usr/share/fonts/X11/misc: skipping, looped directory detected
/usr/share/fonts/X11/util: skipping, looped directory detected
/usr/share/fonts/cmap/adobe-cns1: skipping, looped directory detected
/usr/share/fonts/cmap/adobe-gb1: skipping, looped directory detected
/usr/share/fonts/cmap/adobe-japan1: skipping, looped directory detected
/usr/share/fonts/cmap/adobe-japan2: skipping, looped directory detected
/usr/share/fonts/cmap/adobe-korea1: skipping, looped directory detected
/usr/share/fonts/opentype/ipaexfont-gothic: skipping, looped directory detected
/usr/share/fonts/opentype/ipaexfont-mincho: skipping, looped directory detected
/usr/share/fonts/opentype/malayalam: skipping, looped directory detected
/usr/share/fonts/opentype/noto: skipping, looped directory detected
/usr/share/fonts/opentype/urw-base35: skipping, looped directory detected
/usr/share/fonts/truetype/Gargi: skipping, looped directory detected
/usr/share/fonts/truetype/Gubbi: skipping, looped directory detected
/usr/share/fonts/truetype/Nakula: skipping, looped directory detected
/usr/share/fonts/truetype/Navilu: skipping, looped directory detected
/usr/share/fonts/truetype/Sahadeva: skipping, looped directory detected
/usr/share/fonts/truetype/Sarai: skipping, looped directory detected
/usr/share/fonts/truetype/abyssinica: skipping, looped directory detected
/usr/share/fonts/truetype/ancient-scripts: skipping, looped directory detected
/usr/share/fonts/truetype/dejavu: skipping, looped directory detected
/usr/share/fonts/truetype/droid: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-beng-extra: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-deva-extra: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-gujr-extra: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-guru-extra: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-kalapi: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-orya-extra: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-telu-extra: skipping, looped directory detected
/usr/share/fonts/truetype/fonts-yrsa-rasa: skipping, looped directory detected
/usr/share/fonts/truetype/freefont: skipping, looped directory detected
/usr/share/fonts/truetype/hack: skipping, looped directory detected
/usr/share/fonts/truetype/kacst: skipping, looped directory detected
/usr/share/fonts/truetype/kacst-one: skipping, looped directory detected
/usr/share/fonts/truetype/lao: skipping, looped directory detected
/usr/share/fonts/truetype/liberation: skipping, looped directory detected
/usr/share/fonts/truetype/liberation2: skipping, looped directory detected
/usr/share/fonts/truetype/libreoffice: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-assamese: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-bengali: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-devanagari: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-gujarati: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-kannada: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-malayalam: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-oriya: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-punjabi: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-tamil: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-tamil-classical: skipping, looped directory detected
/usr/share/fonts/truetype/lohit-telugu: skipping, looped directory detected
/usr/share/fonts/truetype/malayalam: skipping, looped directory detected
/usr/share/fonts/truetype/noto: skipping, looped directory detected
/usr/share/fonts/truetype/padauk: skipping, looped directory detected
/usr/share/fonts/truetype/pagul: skipping, looped directory detected
/usr/share/fonts/truetype/samyak: skipping, looped directory detected
/usr/share/fonts/truetype/samyak-fonts: skipping, looped directory detected
/usr/share/fonts/truetype/sinhala: skipping, looped directory detected
/usr/share/fonts/truetype/teluguvijayam: skipping, looped directory detected
/usr/share/fonts/truetype/tibetan-machine: skipping, looped directory detected
/usr/share/fonts/truetype/tlwg: skipping, looped directory detected
/usr/share/fonts/truetype/ttf-khmeros-core: skipping, looped directory detected
/usr/share/fonts/truetype/ubuntu: skipping, looped directory detected
/usr/share/fonts/type1/gsfonts: skipping, looped directory detected
/usr/share/fonts/type1/urw-base35: skipping, looped directory detected
/usr/share/fonts/X11/encodings/large: skipping, looped directory detected
/var/cache/fontconfig: cleaning cache directory
/root/.cache/fontconfig: not cleaning non-existent cache directory
/root/.fontconfig: not cleaning non-existent cache directory
fc-cache: succeeded

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

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

メニューから[ツール]-[オプション]を選択します。
NetBeans日本語化 10

[フォントと色]タブを選択し、[フォント]のを押します。
NetBeans日本語化 11

[フォント]に[IPAexゴシック]を選択し、OKを押します。
NetBeans日本語化 12

OKを押します。
NetBeans日本語化 13

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


Spring Boot 2を使う

私が Spring Frameworkに出会ったのは、Spring Framework 2の頃で、その頃はまだ米国にあった開発元の Pivotal社のものでしたが、2019年に VMware Workstaion Player開発元の VMware社に買収されました。
そして2022年5月、今度は VMware社が Broadcomという半導体企業に買収されてしまいました。
開発元がこのように変わりはしていますが、Spring Frameworkのバージョンアップは続いており、現在では Java Enterprise Editionよりも使われているんじゃないかと思える程の勢いがあります。

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

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

Spring Initializr

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

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

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

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

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

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

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

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

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

これでNetBeansにプロジェクトを作ることができましたので、Spring Webのお作法で WEBアプリを作るためにソースファイルを追加していきます。

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

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

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

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

[GreetingController.java]の編集タブが出来ますので、上記のExampleのソースを貼ってやります。
「/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";
	}

}

Netbeans プロジェクト 9

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

[カテゴリ]に[その他]を、[ファイル・タイプ]に[HTMLファイル]を選択し、[次]を押します。

Netbeans プロジェクト 10

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

先程と同様に「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>

Netbeans プロジェクト 12

ビルドします。
カナズチのボタンNetbeans プロジェクト 13を押します。

するとNetBeansの画面の右下に
Cannot run program "/home/subro/NetBeansProjects/test/mvnw"
のようなエラーが出て失敗しています。

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

subro@Ubuntu2204:~/NetBeansProjects/test$ ls -l
total 32
-rw-rw-r-- 1 subro subro  1055  8月 16 06:17 HELP.md
-rw-rw-r-- 1 subro subro 10284  8月 16 06:17 mvnw
-rw-rw-r-- 1 subro subro  6734  8月 16 06:17 mvnw.cmd
-rw-rw-r-- 1 subro subro  1364  8月 16 06:17 pom.xml
drwxrwxr-x 4 subro subro  4096  8月 16 17:19 src

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

subro@Ubuntu2204:~/NetBeansProjects/test$ ls -l
total 32
-rw-rw-r-- 1 subro subro  1055  8月 16 06:17 HELP.md
-rwxrw-r-- 1 subro subro 10284  8月 16 06:17 mvnw
-rw-rw-r-- 1 subro subro  6734  8月 16 06:17 mvnw.cmd
-rw-rw-r-- 1 subro subro  1364  8月 16 06:17 pom.xml
drwxrwxr-x 4 subro subro  4096  8月 16 17:19 src

改めてカナヅチボタンでビルドします。
今度は上手くいって、画面右下にビルドが完了したメッセージが出ました。
Netbeans プロジェクト 14

最後に実行してみます。

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

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

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

Mavenリポジトリにあるものは MAVEN REPOSITORYで検索できます。

…途中でエラーになりました。
Netbeans プロジェクト 17

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

調べてみると Spring Boot: Configuring a Main Class ここの「2.MAVEN」に、Mavenの設定ファイル pom.xml に以下のように書けば良いとあります。

pom.xml は、Testプロジェクトの直下にありますので、クリックすると編集できます。
Netbeans プロジェクト 18

こうなっているのを

    <properties/>
        <java.version>17</java.version/>
    </properties>

このように変えます。

    <properties/>
        <java.version>17</java.version/>
        <start-class>org.subro.test.TestApplication</start-class>
    </properties>

この変更部分につき Spring Boot 2のドキュメントの該当箇所を読んだところ、上記サイトの

Alternatively, the main class can be defined as the mainClass element of the spring-boot-maven-plugin in the plugin section of our pom.xml:

と書かれている箇所の方法と同じものが書いてあるのみだったので試してみたのですが、上手く行きませんでした。

では改めて[緑色の三角ボタン]を押して実行してみます。

今度は上手く実行できています。
Netbeans プロジェクト 19

WEBブラウザで http://localhost:8080/greeting にアクセスしてみます。
Netbeans プロジェクト 20
ちゃんと動いていますね。

止める時は[赤い四角ボタン]Netbeans プロジェクト 21を押して下さい。

大分長くなりましたが、これで Spring Boot 2を使ったWEBアプリを作って動かすことができました。

このアプリの実体は、1つの jarファイルに Tomcatとサーブレットが一緒に組み込まれているもので、Java Enterprise Editionなしで、Standard Editionだけでできてしまいます。

Spring Initializrの Dependenciesを見てみれば、DBアクセスその他の機能の組み込みが数多くあることが分かると思います。
現在 Java開発フレームワークのデファクトスタンダードになっているのではないでしょうか。


Spring Boot 2の本は本当に少ないです。
公式のドキュメントが充実しているからかも知れませんが、初心者には少々敷居が高いですね。

Spring Boot 2プログラミング入門 [ 掌田津耶乃 ]

価格:3,080円
(2022/8/16 18:45時点)
感想(1件)

Javaによる高速Webアプリケーション開発のためのSpring Boot入門【電子書籍】[ WINGSプロジェクト 小林昌弘 ]

価格:1,760円
(2022/8/16 18:45時点)
感想(0件)

【中古】 Spring Boot2 徹底活用 現場至上主義/廣末丈士(著者),宮林岳洋(著者),高安厚思 【中古】afb

価格:2,695円
(2022/8/16 18:46時点)
感想(0件)