JBoss EAP 8.0で開発を始めてみよう(1)

こんにちは。Red Hatのソリューションアーキテクトの瀬戸です。

今回は、Windows上でJBoss Enterprise Application Platform 8.0(以下EAP)を使用して開発を始めるまでを紹介したいと思います。 Windows上でJava言語を書いたことがあり、手元でJavaを実行することができ、コマンドプロンプトの概念を理解し、コマンドラインツールについては問題なく使用できることを前提としています。

この記事では開発ツールをインストールし、JBoss EAPサーバーを動かして、データソースの設定を行い、データソースの設定を行うところまでを行います。

実際にコードを書いてサーバーにデプロイするところは次回です。

JBoss Enterprise Application Platform とは何か

JBoss Enterprise Application PlatformはRed Hatが出しているエンタープライズグレードのJakarta EE 10仕様に準拠したWebアプリケーションサーバーです。

Java言語でアプリケーションを記述することができ、水平分散、垂直分散、フェイルオーバー等、落ちにくいシステムを作りたいと考えたときに必要とする機能のほぼすべてを網羅しています。

Jakarta EE 10仕様は昔はJava EE仕様と呼ばれていました。

Java EE仕様はJavaのウェブサービスを実装するための仕様をまとめたもので、かつてはOracle社が管理していました。2017年にEclipse Foundationに移管したのですが、その時にOracle社がJavaの商標をEclipse Foudationに使わせることに難色を示したため、新しい名前が公募で決まり、Jakarta EEとなりました。

なお、Jakarta という名前はJava界隈では昔からなじみのある名前です。OSSを管理する団体として有名なApache Software Foudation内でJavaに関わるプロジェクトは Apache Jakarta Projectとして管理されていました。2011年にApache Jakarta Projectという単位は凍結されていたので、6年ぶりの復活でした。

EAP 8.0が準拠している Jakarta EE 10仕様は2022年に制定された仕様ですが、現時点でも最新の仕様です。

Jakarta EE仕様に準拠したサーバー(もしくはJava EE仕様に準拠したサーバー、以下EEサーバー)はJava EEの時代から通じて企業システムの根幹を維持するための製品として支持されてきました。そのため、EAPにおいても、長期間のサポートを行い、細心の注意を払ってテストをしています。 また、EEサーバーは複数社が提供していますが同じ仕様で実装されているため、互換性が高く、ベンダーロックインされにくいというのが特徴です。

複数の製品が同じEE仕様に準拠しているということもあり、EEに関する情報やツール類は流用できるという点も良いです。 実際に多くのライブラリはEE仕様*1に乗っ取って作成されており、EE仕様*2に則っていないアプリケーションサーバーが流行りにくい理由にもなっています。

EAP自体はOSSとして開発されており、upstreamはWildflyとして公開されています。 WildflyにはEAPに搭載される前の実験的な機能が含まれる場合もあるので、新しい機能を試してみたい場合はWildFlyを使ってみると良いでしょう。

www.wildfly.org

Java EEからJakarta EEへの変更

Jakarta EEになってからよりもJava EEであった頃の期間が長いため、多くの情報はJava EEのままになっている場合もあります。Java EEとJakarta EEでは仕様の名前が変わったほかにjavaファイル上のパッケージ名が変更されています。 基本的にJavaでは下位互換性が非常に重要視されており、10年以上前に書かれたプログラムでも普通に動作することがほとんどなのですが、パッケージ名の変更だけは個別で対応する必要があります。

例) javax.http.servlet.HttpServletをjakarta.http.servlet.HttpServletに変更する必要がある

Note: Java SEに含まれるパッケージについては置換が不要なのはご注意ください。(javax.sql等)

また、Javaでアプリケーションを作る場合には多数のコミュニティや企業が作成したライブラリを使用する事ができます。古いライブラリには脆弱性が含まれている可能性があるので、 古い情報を参照してアプリケーションを構築する場合でも最新版のライブラリを使用してセキュリティ面を担保する必要があります。 その際に、Java EEの依存ライブラリで作られたままで、Jakarta EE版のライブラリが存在しない場合は使用ができないので注意が必要です。(2024年6月時点でVelocity等)

開発環境の準備

EAPを快適に開発するためには以下の準備が必要です。

  1. Red Hat Developer Programへの登録
  2. お好きなエディタもしくはIDEの準備
  3. Java実行環境(OpenJDK)のインストール
  4. Mavenのインストール
  5. EAPのインストール
  6. (オプショナル)Podman/RDBMS(RDBMS)のインストール

さて、一つずつ見ていきましょう。

Red Hat Developer Programへの登録

Red Hatでは個人の開発者向けにRed Hat Developer Programを提供しています。一定の利用条件を守ることで、ノンサポートですが、Red Hatの製品を無償で使用する事が出来るようになります。 EAPのダウンロードを行うためには、こちらに登録していただく等で、Red Hatのアカウントを作成していただく必要があります。

詳細については以下をご参照ください。

rheb.hatenablog.com

お好きなエディタもしくはIDEの準備

EAP上で開発するのに特殊なツールは必要がなく、一般的なJava開発環境があれば開発することができます。Jakarta EE仕様にしたがっているため、IDEがJakarta EE対応の機能を持っていればそれを使用する事もできます。 以下のようなツールを使用する事ができます。

  1. Eclipse もしくは Pleiades All in One
  2. Visual Studio Code に Language Support for Java(TM) by Red Hat を組み合わせたもの
  3. IntelliJ IDEA

EclipseはデファクトスタンダードになっているJavaのIDE環境です。無料で使用する事ができます。Pleiades All in One は有志が提供しているEclipseに日本語化ツールや便利な機能を提供するプラグイン類を追加したものです。PCスペックに余裕があってIDEにこだわりがないのならお勧めです。

www.eclipse.org

willbrains.jp

Visual Studio CodeはMicrosoftが出しているエディタです。Language Support for Java(TM) by Red Hatを追加する事でEclipseのように使用する事ができますが、Eclipseに比べると機能が弱いことは否めません。軽い開発環境が欲しい場合は使用してください。

azure.microsoft.com

IntelliJ IDEAは有償のIDEです。無償のCommunity Editionもありますが、Web開発向けの機能は有償機能のみで提供されています。

www.jetbrains.com

これ以外にも多くのJava用の開発環境を使用する事ができます。普段から使用しているものがあればそのまま使用する事も可能です。

この次の記事ではPleiadesを使用しています。

Java実行環境(OpenJDK)のインストール

Javaの実行環境をインストールします。Red HatはRed Hat build of OpenJDKというJavaの実行環境を提供しており、Windows上でも動作させることが可能です。 現時点(2024年6月)時点でEAPはOpenJDK17までをサポートしているため、そちらを使用します。

次のURLからダウンロードすることができます。Red Hatのアカウントが必要になります。登録していない人は先に登録してください。

developers.redhat.com

下の方からjdk-17.0.XX-x64 MSIを探してダウンロードします。

※XXの部分は最新のものを使用するようにしてください。

※慣れている方はZIP版や、他の互換OpenJDKディストリビューションを使用しても大丈夫です。

OpenJDKのダウンロード

ダウンロードしたらmsiを実行することでインストールできます。

インストーラー起動

2つ目の画面でEnd-User License Agreementに同意します。

ライセンス

次はデフォルトのままNextを押します。

セットアップ

Installを押すことでインストールが開始します。

インストールの開始

すぐにインストールが成功するでしょう。

インストールの終了

Note: インストーラーを使用する事で必要な環境変数を自動的に設定してくれます。ZIP版の場合は追加で環境変数の設定が必要になります。Java実行環境のいくつかのバージョンを共存させる必要がある場合などにZIP版を使用します。

Mavenのインストール

MavenはJavaのビルドツールのデファクトスタンダードです。特にどこかの企業が製品として取り扱っているというわけではないのですが、Java開発時には一般的に使用されるツールの一つです。また、これ以外に有名なビルドツールとしてAntやGradleがあります。

Mavenのウェブサイトにアクセスします。

maven.apache.org

Filesから最新のZipファイルをダウンロードします。MavenはすべてJavaで書かれているアプリケーションのため、OSに関係なく同じバイナリを使用する事ができます。

mavenのダウンロード

ダウンロードしたらZIPファイルを適切な場所に解凍します。(例: C:\apps\maven\apache-maven-3.9.8)

解凍したフォルダの中のbinにPATHを通しますために次の操作を行います。

スタートメニューから「環境変数を編集」を選択します。

スタートメニュー

環境変数を選択します。

開いた先からもう一度選択する

環境変数にmavenの下のbinを追加します。 他の値がある場合は削除しないように気を付けてください。

環境変数へ追加

コマンドプロンプトを開いてmvn -vの結果が以下のようになったら正しくインストールされています。

>mvn -v
Apache Maven 3.9.8 (36645f6c9b5079805ea5009217e36f2cffd34256)
Maven home: C:\apps\maven\apache-maven-3.9.8
Java version: 17.0.11, vendor: Red Hat, Inc., runtime: C:\Program Files\RedHat\java-17-openjdk-17.0.11.0.9-1
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"

mvnコマンドが見つからない場合はコマンドプロンプトを開きなおして試してください。それでも見つからないならPATHの設定方法が間違っている等が考えられるので確認してください。

Note: Windows のバージョンによってPATHの設定画面が大きく異なる可能性があります。また、PATHが壊れるとWindows自体が起動しなくなる可能性もあるので、不安がある場合は近くの詳しい人に相談してください。

EAPのインストール

JBoss EAP 8.0をダウンロードします。 次のURLにアクセスしてください。

developers.redhat.com

OpenJDKの時はWindowsインストーラーをダウンロードしましたが、今回は取り回しやすいZip版をダウンロードします。インストーラー版はサーバーとしてEAPを常駐させたい場合等に使用します。

Zipファイルのダウンロード

Note: 本番環境で使用する場合はカスタマーポータルからダウンロードします。また、セキュリティパッチをあてることも忘れないようにしてください。

ダウンロードしたzipを任意の場所に解凍します。(例: C:\apps\jboss\jboss-eap-8.0)

起動できるか確認するため、binのフォルダの下にあるstandalone.batを起動します。

>standalone.bat
Calling "C:\apps\jboss\jboss-eap-8.0\bin\standalone.conf.bat"
Setting JAVA property to "C:\Program Files\RedHat\java-17-openjdk-17.0.11.0.9-1\\bin\java"
===============================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: "C:\apps\jboss\jboss-eap-8.0"

  JAVA: "C:\Program Files\RedHat\java-17-openjdk-17.0.11.0.9-1\\bin\java"

  JAVA_OPTS: "-Dprogram.name=standalone.bat -Xms1G -Xmx1G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Djdk.serialFilter="maxbytes=10485760;maxdepth=128;maxarray=100000;maxrefs=300000" -Xlog:gc*:file="\"C:\apps\jboss\jboss-eap-8.0\standalone\log\gc.log\"":time,uptimemillis:filecount=5,filesize=3M  --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldaps=ALL-UNNAMED --add-exports=jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Djava.security.manager=allow"

(中略)

18:52:41,555 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: http://127.0.0.1:9990/management 上でリッスンす る HTTP 管理インターフェース
18:52:41,555 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: 管理コンソールは http://127.0.0.1:9990 をリッス ンしています。
18:52:41,561 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 8.0.0.GA (WildFly Core 21.0.5.Final-redhat-00001) は 2471 ミリ秒で開始しました - サービス 524 個のうち 282 個を開始しました (318 のサービスはレイジー、パッシブ、またはオンデマンドです) - 使用中のサーバー設定ファイル: standalone.xml

起動したら http://localhost:8080 にアクセスすることで、EAPの初期画面を表示することができます。

EAPの初期画面

別の画面が見えてしまった場合は他のサーバーがすでに起動しています。その場合は他のサーバーをシャットダウンするか、standalone.batを起動する際に

standalone.bat -Djboss.http.port=8081

のように -Djboss.http.port= の後にポート番号を指定してあげることで別のポート番号で起動することができます。

この後の設定やアプリケーションのデプロイ時には起動している必要があるため、そのままにします。*3

(オプショナル)Podman/RDBMS(RDBMS)のインストール

この章の実行はオプショナルです。

EAPではデータベースの接続先の管理をEAPが担い、ユーザーアプリケーションはサーバーに管理されたデータベース接続設定を使用します。EAPが高可用性のための機能を持っており、そちらを使用するためです。高可用性のための機能を必要としない場合はEAPにデータベース接続設定を行う必要がありませんが、通常はEAPに任せます。一度設定を体験していれば簡単ですが、知らないとわかりにくい機能なので、ここで設定をします。

Podmanのインストール

まず、接続先DBを起動するために、Podmanをインストールします。Podmanを使用しなくても直接使用できるDBがある場合はそちらを使用しても大丈夫です。

PodmanはRed Hatが提供しているDocker互換のコンテナ管理ソフトです。Dockerと同じように使用でき、Windowsでも無償で使用する事ができます。

PodmanをWindowsで使用する場合はPodman Desktopをインストールするのが簡単です。以前書いた Podman AI Labを使用してローカルでLLMを動かしてみる という記事でPodman Desktopのインストール方法を説明していますので、そちらを参照してください。

rheb.hatenablog.com

Postgres(DB) の起動

Podman がインストールされていればPostgresの起動は簡単です。コマンドプロンプトを開いて次のコマンドを入力します。

podman image pull docker.io/postgres
podman run --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres

これだけでPostgresが起動します。このPostgresはユーザー名:postgres、パスワード:postgres、接続先ポートとして5432を使用するように設定しています。他のカスタマイズ項目等に興味がある場合は次のURLからpostgresのコンテナイメージのドキュメントを参照してください。

https://hub.docker.com/_/postgres

Note: ここで起動したPostgresはリソースを使用し続けるので不要になったら削除することをお勧めします。削除の仕方は最後に記載します。

データソースの設定

EAPではデータベースへの接続設定をEAPが管理します。高可用性を担保するための仕組みをEAPが持っており、そちらの機能を使用するためです。アプリケーション側にて直接データベースへの接続設定を行うこともできますが、その場合はEAPの持つ高可用性の機能を使用する事が出来ません。管理するためのCLIがありますので、そちらから設定していきます。*4

JDBCドライバのダウンロード

最初に、DB接続用のJDBCドライバをダウンロードします。JavaではDB接続が仕様化されており、対応しているDBであればJDBCドライバを使用する事で同じように操作することができます。今回はPodman上でPostgresを起動していますので、以下のURLからドライバを取得します。

jdbc.postgresql.org

PostgresのJDBCドライバ

今回はJava 17(OpenJDK 17)を使用していますが、Postgresで用意されているものはJava 8用のものまでのようなので、そちらをダウンロードします。左上のものを選択してダウンロードしてください。

Note: Javaは強力な後方互換性を維持しています。多くの場合どれだけ準拠するバージョンが古かろうとも準備されている最新のものを使用する事で正常に動作します。

ダウンロード時にはローカルの適切な場所に保存してください。EAPへの設定時にファイルへのアクセスが必要になります。また、設定後はEAP内にファイルがコピーされるのでダウンロードしたファイルは削除して大丈夫です。

Note: 使用するデータベースの種類、バージョンによって適切なJDBCドライバを準備してください。
EAPへのデータソースの登録

EAPが起動している状態でコマンドプロンプトからEAPをインストールしたフォルダのbinフォルダに移動します。その後、jboss-cli --connectを実行して管理コンソールに接続します。

> cd C:\apps\jboss\jboss-eap-8.0\bin
>jboss-cli --connect
[standalone@localhost:9990 /]

管理コンソール上で、以下のコマンドを入力します。

module add --name=org.postgres --resources=<PATH_TO_JDBC_DRIVER>\postgresql-XX.X.X.jar --dependencies=javax.api,javax.transaction.api
/subsystem=datasources/jdbc-driver=postgres:add(driver-module-name=org.postgres, driver-name=postgres)

data-source add --name=postgresDS --jndi-name=java:jboss/datasources/CoolstoreDS \
--driver-name=postgres \
--connection-url=jdbc:postgresql://localhost:5432/postgres \
--user-name=postgres --password=postgres

※<PATH_TO_JDBC_DRIVER>\postgresql-XX.X.X.jarは実際のファイルへのパスに置き換えてください。

次のコマンドでデータソースのテストを行えます。

/subsystem=datasources/data-source=postgresDS:test-connection-in-pool

以下は正常に設定が完了している場合の出力例です。

{
    "outcome" => "success",
    "result" => [true]
}

これでデータソースの設定は終わりです。

リソースの終了・削除

ここまでで開発を始める前の設定は一通り終わりました。長くなってきたので、ここで一度終わりにするためにリソースを終了・削除します。

EAPの終了

EAPが起動しているコマンドプロンプト上でCTRL-Cを押します。

jboss-cliはexitを入力することで終了することができます。

PostgreSQLの削除

コマンドプロンプト上で以下のコマンドを順に実行します。

podman stop postgres
podman rm postgres
podman rmi postgres
Note: rmでPodman上からのコンテナの削除、rmiでローカルでのイメージのキャッシュを削除しています。今後もコンテナ上でPostgresを使用したい場合は削除しなくても大丈夫です。ただし、stopを実行しない場合は常にPostgresが起動し続けてしまうのでstopだけは忘れないようにしてください。

以上でリソースの終了・削除は終わりです。

おわりに

ここまででJBoss EAPの開発環境を作ってみました。次回はこの開発環境を使って開発をしてきます。

*1:とくにServlet仕様

*2:とくにServlet仕様

*3:なお、コマンドプロンプト上でCTRL-Cを入力することでサーバーをシャットダウンすることができます。

*4:管理コンソールからGUIで設定することもできますが、今回は省略します。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。