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

Tomcatインストール

2024年1月7日

メニューへ戻る

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のバージョンを確認すると以下の通りでした。

残念ながら Ver.10はパッケージではインストールできませんので、Tomcatのサイトのものをダウンロードしてインストールします。

Tomcatサーバーは以下のセットでやります。

サーブレット開発は以下のセットでやります。


Tomcatは Javaのプログラムですから、Javaのランタイムがインストールされている事が前提になりますので先にインストールしておいて下さい。
OpenJDK 21のインストールについては「Java SE Development Kit (JDK) 21 インストール」に書いています。


2.ダウンロード

以下のリンクから [・Core] というところにある [tar.gz] 形式のファイルが対象です。
10.1.17
Tomcatダウンロード

または 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管理トップ画面

Tomcatは動き出しましたので、一旦置いておきます。


5.サーブレット作成

Lubuntu 22.04.3 の上でサーブレットを作ります。

私の普段使いの Lubuntu 22.04.3 にも Ubuntu Serverと同じく OenJDK 21.0.1がインストールしてあります。

普通は EclipseNetBeansといった IDEを使うか、MavenGradleといったビルドツールを使うところですが、ここでは古来よりある原初の方法でやってみます。

ワーキングディレクトリを [~/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] です。
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の日本語本はちょっと古くなったけど、これだけ。