Jakarta EE 11のサーバーを Ubuntuで立てます。
2022年10月に Jakarta EE 10がリリースされてから早3年です。
最新バージョンの 11が 2025年6月にリリースされ、これのサーバーである Payara 7が先日やっとこリリースされましたので早速入れてみようと思います。
Jakarta EE 10(Payara 6)のインストールについて「Jakarta EE 10 の環境構築 (Payaraインストール)」に書いていまして、その時は Rocky Linuxで作ったんですけども、今回は Ubuntu Serverでやってみようと思います。
Javaベースの製品なので、構築作業はどちらの OSでも余り変わらないように思います。
0.ご紹介
富士通は Java EEの頃から Jakarta EEの開発に参加していまして、Interstage Application Serverという製品を出していました。
現時点で Jakarta EE 11に準拠したバージョンが製品化されているかちょっと分からなかったのですが、Jakarta EEについての説明を出していてわかりやすかったので、以下にリンクを貼りますね。
富士通のJakarta EE(Java EE後継技術)への取り組みについて(2025年7月更新)
米国企業ばかりの IT界隈ですが、国内企業が Jakarta EEに関わっているというのは心強く、これからも頑張って欲しいと思います。
国内で企業のサポートを受けられる Jakarta EEのアプリケーションサーバーといえば富士通か Oracleが筆頭候補になるかなぁと思います。
「なら Payaraじゃなくて Interstageのインストールをしろよ」と言われるかもですが、Interstageは企業ユースの有償製品ですので…。
1.環境
Payara(というか Jakarta EE)は Javaの拡張セットみたいなものですから、当然 Javaが必要になります。
以下の構成でいきます。
- Ubuntu Server 24.04
- OpenJDK 25
- Payara Server Community 7
Ubuntu Serverのインストールについては「Ubuntu 24.04 Server インストール」に書いています。
OpenJDK 25のインストールについては「Java SE Development Kit (JDK) 25 インストール」に書いています。
Java 25は Jakarta EE 11よりも後にリリースされていますが、Jakarta EE 11では「Java 17以上」と言っていて一応 OKだと思いますのでこちらを使います。
以下、Ubuntu Serverがあって、そこに Java 25がある状態からスタートします。
2.Payara専用ユーザーを作る
必須ではないんですが、Payaraを実行するユーザー:グループとして、[payara]ユーザーと[payara]グループを作っておこうと思います。
subro@Payara-1:~$ sudo adduser payara
info: ユーザ `payara' を追加しています...
info: 1000 から 59999 の範囲でUID/GID を選択しています...
info: 新しいグループ `payara' (1001) を追加しています...
info: 新しいユーザ `payara' (1001) をグループ `payara (1001)' として追加しています...
info: ホームディレクトリ `/home/payara' を作成しています...
info: `/etc/skel' からファイルをコピーしています...
新しいパスワード: [payara]ユーザーの新規パスワード
新しいパスワードを再入力してください: [payara]ユーザーの新規パスワードをもう一回
passwd: パスワードは正しく更新されました
payara のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
フルネーム []:Enterキー
部屋番号 []:Enterキー
職場電話番号 []:Enterキー
自宅電話番号 []:Enterキー
その他 []:Enterキー
以上でよろしいですか? [Y/n] Y
info: 追加のグループに新しいユーザ 'payara' を追加しています 'users' ...
info: ユーザ `payara' をグループ `users' に追加しています...
できました。
3.Payaraダウンロード
製品である Enterprise版と無償で使える Community版がありますので、ここでは当然後者が対象になります。
以下がダウンロードサイトになります。
Payara Platform Community Edition
結構頻繁に更新されるので、バージョンはどんどん変わりますけど、2025年11月28日時点では Payara Server 7.2025.1 が最新でした。
こちらに出てくるうち、日本語環境で使うので「Payara Server Multi-Language」というのが対象になり、そのうち Full版(Payara ML 7.2025.1 (Multi-Language Full)を選択します。
Downloadを押します。

ダウンロードが完了すると [payara-ml-7.2025.1.zip]ファイルができました。
このファイルは [payara]ユーザーのホームディレクトリ [/home/payara] に置いておきました。
4.Payaraインストール
ダウンロードしたファイルを解凍したいんですが、Ubuntu Serverには unzipコマンドが入っていないのでインストールします。
unzipコマンドのインストールは管理者ユーザーである [subro]でやります。
([payara]ユーザーではない)
subro@Payara-1:~$ sudo apt -y install unzip
〜〜〜 省略 〜〜〜
準備完了したので、[payara]ユーザーにスイッチユーザーして作業を進めます。
ダウンロードしたファイルを解凍します。
payara@Payara-1:~$ unzip payara-ml-7.2025.1.zip
〜〜〜 省略 〜〜〜
inflating: payara7/mq/lib/props/broker/default.properties
inflating: payara7/mq/lib/props/broker/install.properties
inflating: payara7/mq/lib/tyrus-standalone-client.jar
解凍できて、[payara7]ディレクトリができました。
payara@Payara-1:~$ ls -l
合計 168380
-rw-rw-r-- 1 payara payara 172414316 11月 27 07:35 payara-ml-7.2025.1.zip
drwxr-xr-x 8 payara payara 4096 11月 5 20:23 payara7
ディレクトリの中を見てみましょう。
payara@Payara-1:~$ ls -la payara7
合計 36
drwxr-xr-x 8 payara payara 4096 11月 5 20:23 .
drwxr-x--- 4 payara payara 4096 11月 27 07:40 ..
drwxr-xr-x 2 payara payara 4096 11月 5 20:23 META-INF
-rw-r--r-- 1 payara payara 3796 11月 5 20:18 README.txt
drwxr-xr-x 2 payara payara 4096 11月 5 20:23 bin
drwxr-xr-x 10 payara payara 4096 11月 5 20:23 glassfish
drwxr-xr-x 6 payara payara 4096 11月 5 20:23 h2db
drwxr-xr-x 2 payara payara 4096 11月 5 20:23 legal
drwxr-xr-x 8 payara payara 4096 11月 5 20:23 mq
「glassfish」ってディレクトリがありますね。
GlassFishは Jakarta EEの開発元である Eclipseが作ってる Jakarta EEのアプリケーションサーバーですけど、Payaraはこれを内包しているのか。
GlassFishは Java EE 8の頃は「参照実装」と呼ばれていて、オープンソースコミュニティで開発・メンテされていたものでしたが、今はどういう位置付けになってるのは良くわかりませんでした。
Payaraだから内包しているのか、他の企業の Jakarta EE 11の製品でも内包しているのか。
こちらに Eclipseの文書があるものの、読んでもよく分からず。
Jakarta EE Compatibility
気にせず進めます。
結果的に[/home/payara/payara7]ディレクトリがインストールディレクトリになっています。
これはちょっと嫌だな〜という人は [/usr]ディレクトリの下のどこぞなど、お好きな所に [payara7]ディレクトリを移しましょう。
5.Payara起動
Payaraを起動してみます。
[payara]ユーザーでやります。
payara@Payara-1:~$ ./payara7/bin/asadmin start-domain
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by org.jline.nativ.JLineNativeLoader in an unnamed module (file:/home/payara/payara7/glassfish/modules/jline.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
Waiting for domain1 to start .........
Successfully started the domain : domain1
domain Location: /home/payara/payara7/glassfish/domains/domain1
Log File: /home/payara/payara7/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.
起動できたけど、最初にいくつかワーニングが出てしまっていますね。
「名前の付いていないメソッドが呼ばれた」というようなメッセージで、将来のリリースではこういう使い方は制限されるという旨のようです。
オプションを付ければ無視できるようですが、本来はそうすべきではないような気がします。
とりあえず今は放って先に進みます。
[4848/tcp]で待ち受けているようですね。
6.Payara管理画面にアクセス
普段使いの Lubuntuの Firefoxでアクセスしてみます。
私の環境では [http://Payara-1:4848] です。
しますとログイン画面になるのですが、このようなエラーが出ます。

Payaraはインストール直後の素の状態だと、リモートノードからの管理画面アクセスを禁止しています。
これを回避したいのですけど、詳しくはこちらのドキュメントに書いてあります。
Managing Administrative Security
リモードノードから管理画面にアクセスできるようにするのはセキュリティの観点からは緩める方向になります。
この辺りのベストプラクティスは運用環境に依るところがあり、何が良くて悪いというものでもありません。
ここでは以前からやっている通り、デフォルトの最高権限ユーザー [admin] でリモートノードからの管理画面アクセスを可能にしますが、かなりセキュリティ緩めの設定ではあります。
最初期の [admin]ユーザーにはパスワードが設定されていませんので、これを設定します。
payara@Payara-1:~$ ./payara7/bin/asadmin change-admin-password
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by org.jline.nativ.JLineNativeLoader in an unnamed module (file:/home/payara/payara7/glassfish/modules/jline.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
Enter admin user name [default: admin]>Enterキー
Enter the admin password>Enterキー
Enter the new admin password>[admin]ユーザーのパスワード
Enter the new admin password again>[admin]ユーザーのパスワードをもう一回
Command change-admin-password executed successfully.
この作業もワーニングが出て、将来のリリースでは制限をかける方向になってる事が書かれていました。
あまり宜しくない設定のようです。
secure-admin という設定を enable にしてるのでしょう。
payara@Payara-1:~$ ./payara7/bin/asadmin enable-secure-admin
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by org.jline.nativ.JLineNativeLoader in an unnamed module (file:/home/payara/payara7/glassfish/modules/jline.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
Enter admin user name> admin
Enter admin password for user "admin"> [admin]ユーザーのパスワード
セキュリティ保護された管理に対する変更を有効にするには、稼働中のすべてのサーバーを再起動する必要があります。
Command enable-secure-admin executed successfully.
「サーバーを再起動する必要がある」と言っていますが、これは Payaraの再起動のことです。
payara@Payara-1:~$ ./payara7/bin/asadmin restart-domains domain1
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by org.jline.nativ.JLineNativeLoader in an unnamed module (file:/home/payara/payara7/glassfish/modules/jline.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
Enter admin user name> admin
Enter admin password for user "admin"> [admin]ユーザーのパスワード
Successfully restarted the domain
Restarted domain domain1
Command restart-domains executed successfully.
再起動しました。
改めて管理画面にログインすると先程の警告が出なくなっているので、[admin]ユーザーと先程設定した新しいパスワードでログインしましょう。

ログインできました。

7.サーブレットを作る
Payaraサーバーで何かしようとするなら Tomcatではできない Jakarta EEフルセットならではの機能を試すべきなんですが、残念ながら私にそこまでのスキルが無く、サーブレットを動かすのみであります。
Payaraのサイトにチュートリアルがありますのでやってみましょう。
Getting Started with Jakarta EE 11: Hello World
普段遣いの Lubuntu 24.04に Java 25がインストールしてありますので、そこでサーブレットを作ります。
ビルドツールには Mavenが使われていますね。
subro@Lubuntu2404:~/work/java$ mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart
〜〜〜 省略 〜〜〜
[INFO] Using property: javaCompilerVersion = 17
[INFO] Using property: junitVersion = 5.11.0
Define value for property 'groupId': org.subro
Define value for property 'artifactId': hello
Define value for property 'version' 1.0-SNAPSHOT: Enterキー
Define value for property 'package' org.subro: org.subro.hello
Y: Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.5
[INFO] ----------------------------------------------------------------------------
〜〜〜 省略 〜〜〜
[org.subro.hello]プロジェクトができました。
プロジェクトの構成はこうなっています。
subro@Lubuntu2404:~/work/java$ tree
.
└── hello
├── pom.xml
└── src
├── main
│ └── java
│ └── org
│ └── subro
│ └── hello
│ └── App.java
└── test
└── java
└── org
└── subro
└── hello
└── AppTest.java
13 directories, 3 files
プロジェクトファイルの [./hello/pom.xml] はチュートリアルによるとこうなるらしいので全て書き換えます。
ピンク色のところは私の環境(プロジェクト)用に書き換えた箇所になります。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.fuku</groupId>
<artifactId>hello</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-web-api</artifactId>
<version>11.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>hello</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>25</maven.compiler.source>
<maven.compiler.target>25</maven.compiler.target>
<failOnMissingWebXml>false</failOnMissingWebXml>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
(後で分かったのですが、maven-war-pluginのバージョンを上げてやらないとビルド時にエラーになるので入れています。)
これでビルド後に Payaraにデプロイ(配備)する [hello.war]ファイルが得られるはずです。
次に肝心のサーブレットのプログラムなんですが、チュートリアルは WebAPIを作るものでしたので、代わりにオーソドックスな Hello World的なソースを作ります。
[./hello/src/main/java/org/subro/hello/App.java]ファイルと
[./hello/src/test/java/org/subro/hello/AppTest.java]ファイルは雛形に入っていただけのいらないファイルなので削除しまして、
[./hello/src/main/java/org/subro/hello/HelloServlet.java]ファイルを以下の内容で作りました。
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getOutputStream().println("<H1>Hello World</H1>");
}
}
その結果のプロジェクトの中身はこう。
subro@Lubuntu2404:~/work/java$ tree
.
└── hello
├── pom.xml
└── src
├── main
│ └── java
│ └── org
│ └── subro
│ └── hello
│ └── HelloServlet.java
└── test
└── java
└── org
└── subro
└── hello
13 directories, 2 files
ビルドします。
subro@Lubuntu2404:~/work/java$ cd hello
subro@Lubuntu2404:~/work/java/hello$ mvn package
〜〜〜 省略 〜〜〜
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.762 s
[INFO] Finished at: 2025-12-12T07:41:15+09:00
[INFO] ------------------------------------------------------------------------
できました。
プロジェクトはこんな風になりました。
subro@Lubuntu2404:~/work/java$ tree
.
├── pom.xml
├── src
│ ├── main
│ │ └── java
│ │ └── org
│ │ └── subro
│ │ └── hello
│ │ └── HelloServlet.java
│ └── test
│ └── java
│ └── org
│ └── subro
│ └── hello
└── target
├── classes
│ └── HelloServlet.class
├── generated-sources
│ └── annotations
├── hello
│ ├── META-INF
│ └── WEB-INF
│ └── classes
│ └── HelloServlet.class
├── hello.war
├── maven-archiver
│ └── pom.properties
└── maven-status
└── maven-compiler-plugin
├── compile
│ └── default-compile
│ ├── createdFiles.lst
│ └── inputFiles.lst
└── testCompile
└── default-testCompile
└── inputFiles.lst
27 directories, 9 files
[hello.war]ファイルができていますね。
8.サーブレットをデプロイ(配備)する
また Payaraの画面に戻ります。
左のメニューから [アプリケーション] を選択します。

右ペインがこうなりますので、デプロイを押します。

[場所:] に [サーバにアップロードされるパッケージ・ファイル] を選択し、参照を押して先に作った [hello.war] ファイルを選択します。
そうすると [タイプ:][コンテキスト・ルート:][アプリケーション名:]が勝手に入りますので、OKを押します。

[起動] をクリックします。

httpと httpsとでそれぞれのリンクが出ます。

9.サーブレットにアクセス
デプロイ時にコンテキストルートを [/hello] とし、サーブレットのプログラム内では [/HelloServlet] に対して HTMLを返すようにしているので、私の環境での URLは [http://payara-1:8080/hello/HelloServlet] でアクセスできるはずです。
Firefoxでアクセスしてみました。\(^o^)/

10.(おまけ)Payaraの停止
Payaraを起動した画面で以下のコマンドを実行すると止まります。
payara@Payara-1:~$ ./payara7/bin/asadmin stop-domain domain1
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by org.jline.nativ.JLineNativeLoader in an unnamed module (file:/home/payara/payara7/glassfish/modules/jline.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
Waiting for the domain to stop .
Command stop-domain executed successfully.
止まりました。
==========
流石にまだ JakartaEE 11の日本語本は出てませんでした。
というか、出るのでしょうか。