Java Web アプリ開発で使えるサーバー8選 Tomcat、WildFly、Jetty など - 2024年度版
はじめに
最近、VS Code のプロファイル機能を使って、プログラミング言語 Java でソフトウェア開発をするときに使う、Java 開発用プロファイルを作成しようと思ったのですが、その時に、先に何を決めておく必要があるかと考えました。
当然 JDK について決める必要があったので、それについて整理しました。整理したものは次の記事で公開しています。
次に、Java で Web アプリを開発することもあるので、そのときに使用するアプリケーションサーバーについて、何を使うか決めておいた方が良いと考えました。
ということで、Java で使えるアプリケーションサーバーについて調べて、その結果を整理して公開することにしました。。おそらく、Java を全然知らないで Web アプリを開発しようと始めた人の場合は、種類が多くて自分で調べようとしてもわからないことの方が多いのではないでしょうか。
調べた内容については、比較しやすくなるように、一覧にしてみたのですが、Java のバージョンについては正確なものではないかもしれません。Java ではビルド時に必要な JDK のバージョンと、実行時に必要な JRE のバージョンを分けて記載するのが良いのですが、各ソフトウェアのサイトにある情報だと明確にできませんでした。
実際に使う場合は、最新の JDK を使ってビルドして、実行時に Java のバージョンに記載されている JRE で実行すれば大丈夫なはずです。JDK と同じバージョンの JRE で実行できるか知りたい場合は、自分で調べてみてください。
Jakarta EE
Java で実装されたアプリケーションサーバの標準規格を定めるものとして Jakarta EE というものがあります。この標準化をするために、The Eclipse Foundation に Jakarta EE プロジェクトというものがあり、公式サイトが https://jakarta.ee/ja/ にあります。
Java の Web アプリは、Java で実装されたアプリケーションサーバで稼働させることが多いため、Java で Web アプリを開発するときは、Jakarta EE についてある程度知っている必要があります。
Jakarta EE は Java EE という標準規格を引き継いでいるので、少し前の Java で開発された Web アプリでは使われていません。2024年時点だと、開発会社によっては Java EE から Jakarta EE への移行作業をしている最中でしょう。
著者は個人的に Apache Velocity のライブラリを使っていますが、このプロジェクトでは Java EE 版にしか対応していなくて、これから Jakarta EE への対応があるのかどうか、といった状況です。
こういったことからわかるように、2024年時点では、Java で Web アプリを開発する場合に、Java EE 対応のソフトウェアを対象とするのか、Jakarta EE 対応のソフトウェアを対象とするのか、きちんと確認してから開発環境を構築する必要があります。
なお、Java の Web アプリの開発にあたって、どのような仕様に準じて開発すれば良いかについては、Jakarta EE に含まれるサーブレットの仕様(Servlet API)についてのバージョンで判断することもあります。そのため、これらのバージョンについての対応関係も知っておく必要があります。
Jakarta EE と、Java の Web アプリ用の API 仕様を決める Servlet API のバージョンの変遷は次のようになります。最近のものから並べてあります。
Java/Jakarta EE のバージョン | Servlet API のバージョン |
---|---|
Jakarta EE 11 | Jakarta Servlet 6.1 |
Jakarta EE 10 | Jakarta Servlet 6.0 |
Jakarta EE 9 | Jakarta Servlet 5.0 |
Jakarta EE 8 | Jakarta Servlet 4.0 |
Java EE 8 | Java Servlet 4.0 |
Java EE 8 には、Java Servlet 4.0 の仕様が含まれていました。これが Jakarta EE 8 へ移行することになって、Servlet API の仕様も Jakarta Servlet 4.0 へ移行されました。
なお、Jakarta EE では Jakarta Servlet、Jakarta Pages、Jakarta Faces を実行する機能を提供するものを Web コンテナと呼びます。
Java の開発で使用するアプリケーションサーバー
Java の開発で使用するアプリケーションサーバーとしては次の一覧にあるものが有名です。
Java の Web アプリの開発について学習する時には、Jakarta EE がサポートするたくさんの機能を使う必要がないので、Jakarta EE 対応のアプリケーションサーバーを使う必要がありません。Servlet API をサポートするアプリケーションサーバーを使えば十分な場合が多いです。
また、最近は、Spring Boot で開発したアプリのように、アプリケーションサーバーを組み込んで実行可能にした形式を採用する Java ソフトウェアも増えてきています。そういったアプリでは、機能が多いものより、必要な機能だけに絞ったアプリケーションサーバーを組み込みたいということになります。
Apache Tomcat
Apache Tomcat は、Java EE の時代から、Servlet API の参照実装という位置づけで開発されていたソフトウェアなので、Java の Web アプリを開発する方法について学習するというときに、一番人気があるアプリケーションサーバーです。
Apache Tomcat の Sevlet API のバージョンについては https://tomcat.apache.org/whichversion.html に記載があります。
ソフトウェアのバージョン | Servlet API のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Apache Tomcat 10.1.x | Jakarta Servlet 6.0 | Java 11 | Java 11 以降に対応 |
Apache Tomcat 9.0.x | Jakarta Servlet 4.0 | Java 8 | Java 8 以降に対応 |
Apache TomEE
Apache TomEE は Jakarta EE に対応するアプリケーションサーバーです。内部的に Apache Tomcat を使っていますから、対応する Servlet API は、そのバージョンに依存します。https://tomee.apache.org/comparison.html に対応表があります。
ソフトウェアのバージョン | Jakarta EE のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Apache TomEE 9.1 | Jakarta EE 9.1 | Java 11 | Apache Tomcat 10.0 をベース |
Apache TomEE 8.0 | Jakarta EE 8 | Java 8 | Apache Tomcat 9.0 をベース |
Apache Tomcat を利用していて Jakarta EE の機能を使いたいと思ったときに、このアプリケーションサーバーの採用を検討するというのはありでしょう。
Eclipse Jetty
Eclipse Jetty については、著者は Apache Tomcat よりも軽量に動作する Servlet API 対応のアプリケーションサーバーという印象を持っています。
今回、アプリケーションサーバーについて調べるときに対応する Servlet API のバージョンと Jakarta EE のバージョンを調べたところ、Jetty は Jakarta EE の対応バージョンが公式の Web サイトに掲載されていました。実際のところ、Jakarta EE をフルサポートしているかまでは確認していません。
Eclipse Jetty が対応する Jakarta EE のバージョンについては、https://jetty.org/docs/jetty/12/index.html にある情報を参考にしました。対応表に Jakarta EE のバージョンが書いてあったので、そのまま入れてあります。
ソフトウェアのバージョン | Jakarta EE のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Eclipse Jetty 12.0.x | Jakarta EE 8, EE 9, EE 10 | Java 17 | |
Eclipse Jetty 11.0.x | Jakarta EE 9 | Java 11 | サポート終了 |
Eclipse Jetty 10.0.x | Jakarta EE 8 | Java 11 | サポート終了 |
Eclipse GrassFish
Eclipse GrassFish は、もともとは Oracle が開発していた GrassFish という OSS が The Eclipse Foundation に寄贈されて開発が続いているものになります。GlassFish は Java EE の参照実装という位置づけのものだったことから、Jakarta EE でも引き続き参照実装という位置づけとなっていて、よく使われています。
Eclipse GrassFish については、Eclipse GlassFish の GitHub サイト や Eclipse GlassFish Release Notes, Release 7 のページを参考にして一覧にしました。
ソフトウェアのバージョン | Java/Jakarta EE のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Eclipse GlassFish 7.0.16 | Jakarta EE 10 | Java 11 | Java 17 と Java 21 に対応 |
Eclipse GlassFish 6.2.0 | Jakarta EE 9.1 | Java 11 | Java 17 に対応 |
Eclipse GlassFish 6.1.0 | Jakarta EE 9.1 | Java 11 | |
Eclipse GlassFish 6.0.0 | Jakarta EE 9 | Java 8 | |
Eclipse GlassFish 5.1.0 | Java EE 8 and Jakarta EE 8 | Java 8 |
Undertow
Undertow は、https://undertow.io/ によると、WildFly のデフォルト Web サーバーとして採用されているアプリケーションサーバーです。
Undertow が対応する Servlet API のバージョンは、公式サイトの情報からでは明確ではありませんが、GitHub で公開されているプロジェクトの pom.xml
の情報から次のように対応していると判断しました。
ソフトウェアのバージョン | Servlet API のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Undertow 2.3.17.Final | Jakarta Servlet 6 | Java 11 | |
Undertow 2.2.35.Final | Java Servlet 4.0 | Java 8 |
WildFly
WildFly は以前は JBoss AS (JBoss Application Server) という名前で開発されていて、JBoss EAP (Red Hat JBoss Enterprise Application Platform) のベースとなるアプリケーションサーバーです。
Red Hat が支援するプロジェクトで開発されている OSS のため、継続的に開発が維持されています。
WildFly については、https://docs.wildfly.org/ にある Preview WildFly Releases の欄に対応表があります。ここでは一部を抜粋してあります。
ソフトウェアのバージョン | Java/Jakarta EE のバージョン | Java のバージョン | 備考 |
---|---|---|---|
WildFly 33.0.0.Final | Jakarta EE 10 | Java 11 | Java 11 以降に対応 |
WildFly 28.0.0.Final | Jakarta EE 10 | Java 11 | Java 11 以降に対応、JBoss EAP 8.0 のベース |
WildFly 23.0.0.Final | Jakarta EE 8、EE 9 | Java 8 | Java 8 以降に対応、JBoss EAP 7.4 のベース |
WildFly 18.0.0.Final | Java EE 8、Jakarta EE 8 | Java 8 | Java 8 以降に対応、JBoss EAP 7.3 のベース |
JBoss EAP と WildFly のバージョンについての対応表は https://access.redhat.com/solutions/21906 にありました。次のようになっています。
JBoss EAP のバージョン | WildFly のバージョン |
---|---|
JBoss EAP 8.0 | WildFly 28 |
JBoss EAP 7.4 | WildFly 23 |
JBoss EAP 7.3 | WildFly 18 |
JBoss EAP 7.2 | WildFly 14 |
JBoss EAP 7.1 | WildFly 11 |
JBoss EAP 7.0 | WildFly 10 |
Payara Platform Community
Payara Platform Community は、Oracle が開発していた頃の GlassFish から分岐した OSS です。昔は Payara Server という名前でしたが、Payara Server Community、Payara Community といった名前で呼ばれていたときもあるようです。
Payara Services Ltd が商用サポートをする Enterprise 版のベースとなっていて、継続的に開発が進められています。
Payara Platform Community については、https://github.com/payara/Payara/ のリリース情報から一覧を作成しました。
ソフトウェアのバージョン | Java/Jakarta EE のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Payara Platform Community 7 | Jakarta EE 11 | Java 11 | Java 11 以降に対応 |
Payara Platform Community 6 | Jakarta EE 10 | Java 11 | Java 11 以降に対応 |
Payara Platform Community 5 | Jakarta EE 8、EE 9 | Java 8 | Java 8 以降に対応 |
Payara Server 4 | Java EE 8 | Java 8 | Java 8 以降に対応 |
参考までに、https://www.payara.fish/products/payara-server/ には Enterprise 版のサポートについての説明があります。
Open Lieberty
Open Lieberty は、高速かつ効果的なクラウドネイティブの Java マイクロサービスを構築するための軽量のオープンソースのフレームワークです。
IBM の WebSphere Application Server のランタイムに採用されているので、開発プロジェクトも IBM から支援されているはずです。そのため、継続的な利用ができそうです。
Open Lieberty については https://openliberty.io/docs/24.0.0.7/overview.html や https://openliberty.io/docs/23.0.0.3/overview.html を参照しました。各バージョンには対応している Java SE の情報を説明する https://openliberty.io/docs/24.0.0.7/java-se.html や Jakarta EE の情報を説明する https://openliberty.io/docs/24.0.0.7/reference/jakarta-ee-api.html といったページがあるので、これらを参照して一覧表を作成しました。
ソフトウェアのバージョン | Java/Jakarta EE のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Open Liberty 24.0 | Java EE 7, Java/Jakarta EE 8, Jakarta EE 9.1, EE 10 | Java 11 | Java 8、11、17、21 に対応 |
Open Liberty 23.0 | Java EE 7, Java/Jakarta EE 8, Jakarta EE 9.1, EE 10 | Java 11 | Java 8、11、17 に対応 |
Open Liberty 22.0 | Java EE 7, Java/Jakarta EE 8, Jakarta EE 9.1 | Java 11 | Java 8、11、17 に対応 |
Spring Boot の組み込みアプリケーションサーバー
Spring Boot では、Spring Web MVC を使うアプリケーションを作成すると、組み込みのアプリケーションサーバーが依存関係に含まれるようになります。そのため、Spring Boot のバージョンと埋め込みで使われるアプリケーションサーバーのバージョンについては意識する必要があります。選択肢には下記があります。
- Apache Tomcat
- Eclipse Jetty
- Undertow
- Reactor
Reactor は https://projectreactor.io/ で開発されているソフトウェアで、https://spring.io/reactive のページに Spring Boot で使う場合の説明があります。サーブレットには対応していない点に注意が必要です。
ここでは、Spring Boot 組み込みの Apache Tomcat について調べました。https://docs.spring.io/spring-boot/system-requirements.html や https://docs.spring.io/spring-boot/appendix/dependency-versions/coordinates.html に執筆時の最新である 3.3 の情報が記載されています。
ちなみに、過去のものについて調べるときは HTML ドキュメントを参照するとわかります。例えば、1.5.22.RELEASE のように古いものは https://docs.spring.io/spring-boot/docs/1.5.22.RELEASE/reference/htmlsingle/#appendix-dependency-versions で確認できます。1.5.22.RELEASE を 2.0.9.RELEASE、2.1.18.RELEASE へ置き換えても確認できました。
最近のものは HTML が変更されていて、2.7.18 のものについては、https://docs.spring.io/spring-boot/docs/2.7.18/reference/html/dependency-versions.html で確認できました。2.7.18 を 3.0.13、3.1.12、3.2.9 へ置き換えた場合も確認できました。
調べた結果をまとめた一覧は次のようになります。
ソフトウェアのバージョン | Servlet API のバージョン | Java のバージョン | 備考 |
---|---|---|---|
Spring Boot 3.3 | Jakarta Servlet 6.0 | Java 17 | Java 17 以降に対応、Tomcat 10.1、Spring Framework 6.1 |
Spring Boot 3.2 | Jakarta Servlet 6.0 | Java 17 | Java 17 以降に対応、Tomcat 10、Spring Framework 6.1 |
Spring Boot 3.1 | Jakarta Servlet 6.0 | Java 17 | Java 17 以降に対応、Tomcat 10、Spring Framework 6.0 |
Spring Boot 3.0 | Jakarta Servlet 6.0 | Java 17 | Java 17 以降に対応、Tomcat 10、Spring Framework 6.0 |
Spring Boot 2.7 | Jakarta Servlet 4.0 | Java 11 | Java 11 以降に対応、Tomcat 9、Spring Framework 5.3 |
Spring Boot 2.1 | Jakarta Servlet 4.0 | Java 11 | Java 11 以降に対応、Tomcat 9、Spring Framework 5.1 |
Spring Boot 2.0 | Java Servlet 3.1 | Java 7 | Java 7 以降に対応、Tomcat 8.5、Spring Framework 5.0 |
VS Code の Community Server Connector
VS Code で Java のアプリケーションサーバーを利用するときは、下記の拡張機能をインストールして使うのが便利です。
- Runtime Server Protocol UI: redhat.vscode-rsp-ui
- Community Server Connector: redhat.vscode-community-server-connector
- Server Connector: redhat.vscode-server-connector
ここで、Community Server Connector 拡張機能でサーバー作成時の選択肢に出てくるリストには次のものが含まれています。
- Apache Tomcat
- GlassFish
- Jetty
- Payara
- WebSphere Liberty
今回紹介した Apache Tomcat、Eclipse GlassFish、Eclipse Jetty、Payara Platform Community、Open Liberty に対応するのは、それぞれ Apache Tomcat、GlassFish、Jetty、Payara、WebSphere Liberty になります。
次に、Server Connector 拡張機能でサーバー作成時の選択肢に出てくるリストには次のものが含まれています。
- WildFly
これを指定することで、WildFly が使えるようになります。
Eclipse IDE の WTP
Eclipse IDE で開発環境を用意することもあるので、簡単に各アプリケーションサーバーのサポート状況を調べてみました。実際に動かすところまではしていないので、内容については不確かな部分があります。
Eclipse IDE でアプリケーションサーバーを使うには WTP プラグインを使います。WTP のプロジェクトのサイトは https://projects.eclipse.org/projects/webtools にあります。
WTP プラグインをインストールしてあると Eclipse IDE でサーバー・ランタイム環境を管理することができるようになります。
サーバー・ランタイム環境を新規作成する際には、選択肢に下記のものが含まれます。
- Apache
- Apache Tomcat
- Red Hat JBoss Middlwear
- JBoss AS, WildFly, & EAP Server Tools
これを使って Apache Tomcat、Apache TomEE、WildFly は利用することができるはずです。
WTP プラグインだけでは動かせないものもあります。次のものは Eclipse IDE にプラグインをインストールすることで使えるようになるようです。
- GlassFish: GlassFish Tools plugin
- Payara: Payara Tools plugin
- Open Liberty: Liberty Tools plugin
Eclipse Jetty については Eclipse IDE に対応する jetty-wtp プラグインというものがあるようでしたが、最新版の Eclipse IDE に対応しているかわかりませんでした。
Undertow については、Eclipse IDE が対応しているかわかりませんでした。
Maven プラグイン
Maven プロジェクトを使う場合は、Maven のプラグインで Web アプリをアプリケーションサーバーへデプロイして開発作業をすることもあります。その場合は、次のものが便利です。
Cargo は多くのアプリケーションサーバーに対応しています。以下に一部の例を挙げます。
- GlassFish 7.x
- Jetty 12.x
- Payara
- Tomcat 10.x
- TomEE 9.x
- WebSphere Liberty
- WildFly 33.x
Maven のプラグインである cargo-maven3-plugin についての説明は以下の URL にあります。
使い方を見るとわかるように、使用するアプリケーションサーバーとダウンロード用 URL の指定をしながらプラグインの実行ができて、手軽に始めることができます。例えば Tomcat 9.0.45 を使う場合は次のコマンドを実行します。
mvn clean verify org.codehaus.cargo:cargo-maven3-plugin:run
-Dcargo.maven.containerId=tomcat9x
-Dcargo.maven.containerUrl=https://repo.maven.apache.org/maven2/org/apache/tomcat/tomcat/9.0.45/tomcat-9.0.45.zip
Cargo と Maven を組み合わせて使うと、開発で必要な大体のことはできるので、これを使っていれば良いのですが、覚えることが多いと感じる場合もあるでしょう。また、参考にする資料によっては他のプラグインを使っている場合があります。その場合は他のものを選択して使うことになります。
Tomcat 用には tomcat-maven-plugin がありましたが、今は開発がされていません。最新の安定版は tomcat7-maven-plugin
になり、これを使って起動される組み込み版 Tomcat のバージョンは 7 と古いものになります。リモートデプロイ機能を使う場合は Tomcat 8 以降も使えます。配布用のプラグインは以下の URL で公開されています。
TomEE 用には TomEE Maven Plugin があります。配布用のプラグインは以下の URL で公開されています。
Undertow 用には undertow-core があります。配布用のプラグインは以下の URL で公開されています。
WildFly 用には WildFly Maven Plugin があります。配布用のプラグインは以下の URL で公開されています。
Eclipse Jetty には Jetty Maven Plugin があります。Web アプリで使用している Jakarta EE のバージョンによってプラグインを変えます。配布用のプラグインは以下の URL で公開されています。
Eclipse GlassFish 用には glassfishbuild-maven-plugin があります。配布用のプラグインは以下の URL で公開されています。
Payara は Cargo を利用する例はありましたが、専用プラグインはありませんでした。ただし、Payara Micro Maven Plugin というものはありました。配布用のプラグインは以下の URL で公開されています。
Open Liberty 用には ci.maven があります。配布用のプラグインは以下の URL で公開されています。
なお、Spring Boot 用には Spring Boot Maven Plugin があります。Spring Boot は CLI を使ってプロジェクト生成をすると自動で Maven のプラグインが組み込まれるので、自分で指定することはあまりないはずです。配布用のプラグインは以下の URL で公開されています。
Discussion