Javaサーブレットを実行する Tomcatサーバーをインストールします。
Spring Bootの登場や、パブリッククラウドによる Javaサーブレット実行環境 PaaSの登場で、余り表に出てこなくなったオンプレでの Javaサーブレット実行環境の構築作業なんで今更感がありますが、基本ですからやってみましょう。
サーブレットの立役者と言えば言わずと知れたこれ。
Apache Tomcat
最早説明の必要はありませんね。
サーブレットのどんな本でもコレを使っていますから。
では早速インストールして、サーブレットの一つも動かしてみましょう。
1.環境
2024年1月7日時点の Tomcatの最新バージョンは 10.1.17です。
これは Jakarta EE 10に準拠しているのと、Java 21に対応したものになっています。
Ubuntu Server 22.04で動かそうと思いますので、Ubuntuのパッケージリポジトリに登録してある Tomcatのバージョンを確認すると以下の通りでした。
- snap: 登録なし
- apt: Ver.9
残念ながら Ver.10はパッケージではインストールできませんので、Tomcatのサイトのものをダウンロードしてインストールします。
Tomcatサーバーは以下のセットでやります。
- Ubuntu Server 22.04.3
- OpenJDK 21.0.1
- Tomcat 10.1.17
サーブレット開発は以下のセットでやります。
- Lubuntu 22.04.3
- OpenJDK 21.0.1
Tomcatは Javaのプログラムですから、Javaのランタイムがインストールされている事が前提になりますので先にインストールしておいて下さい。
OpenJDK 21のインストールについては「Java SE Development Kit (JDK) 21 インストール」に書いています。
2.ダウンロード
以下のリンクから [・Core] というところにある [tar.gz] 形式のファイルが対象です。
10.1.17
または curlコマンドで
subro@UbuntuServer2204-1:~$ curl -O https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.17/bin/apache-tomcat-10.1.17.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 11.9M 100 11.9M 0 0 8161k 0 0:00:01 0:00:01 --:--:-- 8160k
ダウンロードが完了すると [apache-tomcat-10.1.17.tar.gz]ファイルができました。
3.インストール
Ubuntu Serverにダウンロードした圧縮ファイルがある前提で、を展開します。
subro@UbuntuServer2204-1:~$ ls -l apache-tomcat-10.1.17.tar.gz
-rw-rw-r-- 1 subro subro 12484785 1月 7 13:00 apache-tomcat-10.1.17.tar.gz
Tomcat運用の専用ユーザーとして、[tomcat]ユーザーを作ります。
subro@UbuntuServer2204-1:~$ sudo adduser tomcat
ユーザー `tomcat' を追加しています...
新しいグループ `tomcat' (1002) を追加しています...
新しいユーザー `tomcat' (1002) をグループ `tomcat' に追加しています...
ホームディレクトリ `/home/tomcat' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい パスワード: tomcatユーザーの新規パスワード
新しい パスワードを再入力してください: パスワードをもう一回
passwd: パスワードは正しく更新されました
tomcat のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
フルネーム []: Enterキー
部屋番号 []: Enterキー
職場電話番号 []: Enterキー
自宅電話番号 []: Enterキー
その他 []: Enterキー
以上で正しいですか? [Y/n] Y
[tomcat]ユーザー・[tomcat]グループができました。
ダウンロードした Tomcatの圧縮ファイルを解凍します。
subro@UbuntuServer2204-1:~$ tar -xzvf apache-tomcat-10.1.17.tar.gz
apache-tomcat-10.1.17/conf/
apache-tomcat-10.1.17/conf/catalina.policy
〜〜〜 中略 〜〜〜
apache-tomcat-10.1.17/bin/tool-wrapper.sh
apache-tomcat-10.1.17/bin/version.sh
subro@UbuntuServer2204-1:~$ ls -ld apache-tomcat-10.1.17
drwxrwxr-x 9 subro subro 4096 1月 7 13:07 apache-tomcat-10.1.17
[apache-tomcat-10.1.17]ディレクトリができました。
実際の置き場所は [/usr/local]ディレクトリ下にします。
subro@UbuntuServer2204-1:~$ sudo mv apache-tomcat-10.1.17 /usr/local
subro@UbuntuServer2204-1:~$ ls -ld /usr/local/apache-tomcat-10.1.17
drwxrwxr-x 9 subro subro 4096 1月 7 13:07 /usr/local/apache-tomcat-10.1.17
ディレクトリを移動できました。
ディレクトリとその中に入っているファイルのオーナーとグループを全て [tomcat]に変えます。
chownコマンド(change file owner and group)に [-R]オプションで、以下全てという意味になります。
subro@UbuntuServer2204-1:~$ sudo chown -R tomcat:tomcat /usr/local/apache-tomcat-10.1.17
subro@UbuntuServer2204:~$ ls -ld /usr/local/apache-tomcat-10.1.17
drwxrwxr-x 9 tomcat tomcat 4096 1月 7 13:07 /usr/local/apache-tomcat-10.1.17
変更できました。
インストールはこれで完了です。
4.Tomcat起動
Ubuntu Serverに [tomcat]ユーザーでログインし直しました。
[/usr/local/apache-tomcat-10.1.17]ディレクトリに移って中を見てみました。
tomcat@UbuntuServer2204-1:~$ cd /usr/local/apache-tomcat-10.1.17
tomcat@UbuntuServer2204-1:/usr/local/apache-tomcat-10.1.17$ ls -la
合計 156
drwxrwxr-x 9 tomcat tomcat 4096 1月 7 13:07 .
drwxr-xr-x 11 root root 4096 1月 7 13:11 ..
-rw-r----- 1 tomcat tomcat 20122 12月 8 08:31 BUILDING.txt
-rw-r----- 1 tomcat tomcat 6210 12月 8 08:31 CONTRIBUTING.md
-rw-r----- 1 tomcat tomcat 60393 12月 8 08:31 LICENSE
-rw-r----- 1 tomcat tomcat 2333 12月 8 08:31 NOTICE
-rw-r----- 1 tomcat tomcat 3398 12月 8 08:31 README.md
-rw-r----- 1 tomcat tomcat 6776 12月 8 08:31 RELEASE-NOTES
-rw-r----- 1 tomcat tomcat 16076 12月 8 08:31 RUNNING.txt
drwxr-x--- 2 tomcat tomcat 4096 1月 7 13:07 bin
drwx------ 2 tomcat tomcat 4096 12月 8 08:31 conf
drwxr-x--- 2 tomcat tomcat 4096 1月 7 13:07 lib
drwxr-x--- 2 tomcat tomcat 4096 12月 8 08:31 logs
drwxr-x--- 2 tomcat tomcat 4096 1月 7 13:07 temp
drwxr-x--- 7 tomcat tomcat 4096 12月 8 08:31 webapps
drwxr-x--- 2 tomcat tomcat 4096 12月 8 08:31 work
まだ何もサーブレットをデプロイ(配備)していませんが、とりあえず Tomcatを立ち上げてみます。
tomcat@UbuntuServer2204-1:/usr/local/apache-tomcat-10.1.17$ ./bin/startup.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-10.1.17
Using CATALINA_HOME: /usr/local/apache-tomcat-10.1.17
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-10.1.17/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/apache-tomcat-10.1.17/bin/bootstrap.jar:/usr/local/apache-tomcat-10.1.17/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
立ち上がりました。
[8080/tcp](http)で待ち受けていますので、Webブラウザでアクセスします。
私の環境では [http://UbuntuServer2204-1:8080] です。
こんな画面になります。(小さくし過ぎましたが)
Tomcatは動き出しましたので、一旦置いておきます。
5.サーブレット作成
Lubuntu 22.04.3 の上でサーブレットを作ります。
私の普段使いの Lubuntu 22.04.3 にも Ubuntu Serverと同じく OenJDK 21.0.1がインストールしてあります。
普通は Eclipseや NetBeansといった IDEを使うか、Mavenや Gradleといったビルドツールを使うところですが、ここでは古来よりある原初の方法でやってみます。
ワーキングディレクトリを [~/work/java/HelloServlet] としています。
サーブレット作成に必要な Jakarta EE 10のクラスが入っている jarファイルが Tomcatのディレクトリにありますので scpコマンドで持ってきます。
subro@Lubuntu2204:~/work/java/HelloServlet$ scp tomcat@UbuntuServer2204-1:/usr/local/apache-tomcat-10.1.17/lib/servlet-api.jar .
servlet-api.jar 100% 358KB 63.2MB/s 00:00
必要なディレクトリを作ります。
subro@Lubuntu2204:~/work/java/HelloServlet$ mkdir -p WEB-INF/classes
サーブレットのソースを書きます。
ファイル名は [HelloServlet.java] です。
subro@Lubuntu2204:~/work/java/HelloServlet$ cat HelloServlet.java
import java.io.*;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/")
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println("Hello Servlet!");
out.println("");
out.println("");
}
}
ソースをコンパイルします。
この時に先程持ってきた servlet-api.jar を参照するようにします。
subro@Lubuntu2204:~/work/java/HelloServlet$ javac -classpath servlet-api.jar HelloServlet.java
subro@Lubuntu2204:~/work/java/HelloServlet$ ls -l
total 372
-rw-rw-r-- 1 subro subro 844 1月 7 13:39 HelloServlet.class
-rw-rw-r-- 1 subro subro 552 1月 7 13:39 HelloServlet.java
drwxrwxr-x 3 subro subro 4096 1月 7 13:34 WEB-INF
-rw-r----- 1 subro subro 366661 1月 7 13:32 servlet-api.jar
コンパイルできて [HelloServlet.class]ファイルができました。
できあがったクラスファイルを [WEB-INF/classes]ディレクトリに移動します。
subro@Lubuntu2204:~/work/java/HelloServlet$ mv HelloServlet.class WEB-INF/classes
[HelloServlet.java]ファイルと [servlet-api.jar]ファイルはもういらないので消します。
subro@Lubuntu2204:~/work/java/HelloServlet$ rm HelloServlet.java servlet-api.jar
結果こういう構成になっているはずです。
subro@Lubuntu2204:~/work/java/HelloServlet$ tree
.
└── WEB-INF
└── classes
└── HelloServlet.class
2 directories, 1 file
このセットを Tomcatへの配置(デプロイ)のため、WAR(Web Application Archive)ファイルにします。
ファイル名を [HelloServlet.war] にしておきました。
subro@Lubuntu2204:~/work/java/HelloServlet$ jar -cvf ../HelloServlet.war .
マニフェストが追加されました
WEB-INF/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/HelloServlet.classを追加中です(入=844)(出=482)(42%収縮されました)
親ディレクトリに [HelloServlet.war]ファイルができています。
subro@Lubuntu2204:~/work/java/HelloServlet$ cd ..
subro@Lubuntu2204:~/work/java$ ls -l HelloServlet.war
-rw-rw-r-- 1 subro subro 1158 1月 7 13:44 HelloServlet.war
これでサーブレットプログラムができました。
6.サーブレット配備(デプロイ)
作られたサーブレットプログラムを Tomcatに配備(デプロイ)すると実行されます。
[HelloServlet.war]ファイルを Ubuntu Serverの Tomcatの [webapps]ディレクトリに置くと、自動的に展開されて配備(デプロイ)完了です。
subro@Lubuntu2204:~/work/java$ scp HelloServlet.war tomcat@UbuntuServer2204-1:/usr/local/apache-tomcat-10.1.17/webapps
HelloServlet.war 100% 1158 1.3MB/s 00:00
これで配備(デプロイ)できているはずです。
Tomcatにアクセスすればサーブレットが動いて 「Hello Servlet!」となるはずです。
私の環境では [http://UbuntuServer2204-1:8080/HelloServlet] です。
上手く動きました。\(^o^)/
これで、Tomcatの導入からサーブレットの配備(デプロイ)までができました。
7.Tomcatの止め方
Tomcatのサーバーでの作業ですので、Ubuntu Serverで実行します。
tomcat@UbuntuServer2204-1:/usr/local/apache-tomcat-10.1.17$ ./bin/shutdown.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-10.1.17
Using CATALINA_HOME: /usr/local/apache-tomcat-10.1.17
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-10.1.17/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/apache-tomcat-10.1.17/bin/bootstrap.jar:/usr/local/apache-tomcat-10.1.17/bin/tomcat-juli.jar
Using CATALINA_OPTS:
==========
昔ながらのやり方で最新の Tomcatを動かしてみました。
今ではパブリッククラウドがサーブレットを実行できる PaaSをやってますので Tomcatをインストールして使うことは減っていると思います。
ただ、PaaSは中の人が Tomcatを実行しているのであり、Spring Bootで作られる単一 jarファイルのアプリケーションも中で Tomcatが動いています。
サーブレットの運用のベースに Tomcatや Jakarta EEがあるのは変わらないので、パブリッククラウドのサービスを使っていても何かと Tomcatでやっている時の言葉が出てきます。
Javaの Webアプリを運用する限り Tomcatをお勉強しておいて損はないですね。
比較的新しいサーブレット本はこの2つ。
Jakarta EEの日本語本はちょっと古くなったけど、これだけ。