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

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

気が付けば前回から3か月も空いてしまっていました。
今回は構築した環境を使用して実際にアプリケーションを開発していきたいと思います。
この記事では簡単なアプリケーションのデプロイまでを行います。

前回の記事はこちら。

rheb.hatenablog.com

前回の記事では、JBoss EAP/Mavenの設定をして簡単な動作確認まで終わりました。

IDEは前回の記事の中で予告していた通りPleiadesを使用します。 ダウンロードして、デフォルト状態でインストールされている状態から開始します。

※この記事ではWindows x64用 Java Full Editionの2024-06.20240626を使用しています。*1

Pleiadesのダウンロードは次のURLから行うことができます。インストールも含めて簡単なので、使ったことがない人はぜひ試してみてください。

willbrains.jp

今回使用する機能はJBoss EAP 8.0のマニュアル上非推奨とマークされている機能が含まれています。 しかし、これは即座に使用するなという意味ではなく、当面は使用し続けることができます。

また、以前はJBoss Developer Studioという製品が有償で提供されていましたが、現在は販売が終了しております。 現在は開発を行うためにはコミュニティによるツールやサードパーティー製品を使用する必要があります。ご注意ください。

プロジェクトの作成

Eclipse上からファイル->新規(N)->Mavenプロジェクトを選択します。

新規プロジェクトの作成

シンプルなプロジェクトの作成(s)(アーキタイプ選択のスキップ)にチェックを入れて 、次へ(N)を押します。

新規Mavenプロジェクト

成果物の欄で、グループIDに任意の文字列、アーティファクトIDとして保存先のフォルダの名前(ここではexampleにしています)、パッケージングとしてwarを指定します。入力したら完了を押します。

プロジェクトの構成

Note: ここではmavenにプロジェクトの設定を入力しています。後ほどmavenの設定ファイルを直接編集して直します。

指定したアーティファクトIDの名前の付いたプロジェクトが作成されます。

生成されたプロジェクト

pom.xmlの編集

このプロジェクト用に生成されたpom.xmlを編集して、JBoss EAPに合うように変更します。

生成されたプロジェクトにpom.xmlがあることを確認してください。

mavenを使用したプロジェクトの作成方法はJBoss EAP にデプロイするアプリケーションの開発のスタートガイド に記載がありますが、細切れになっているため、JBoss EAP 8.0の設定をすべて行ったpom.xmlのテンプレートを準備しました。

以下の内容をpom.xmlに上書きしてください。

https://gist.github.com/ssetoredhat/5b1bcc2226380ba88131f21e60cffee5

3つの項目を編集する必要があります。

6行目と7行目のgroupIdとartifactIdを編集します。

    <groupId>com.redhat.sseto</groupId>
    <artifactId>example</artifactId>

groupIdにはドメイン名を入れます。インターネット上に公開する予定がない場合は自由に入れて大丈夫です。 artifactIdにはこのプロジェクトの名前を入れます。

31行目のfinalNameを編集します。

        <finalName>example</finalName>

これはアプリケーションがJBoss EAP上にデプロイされた場合のコンテキスト名(アプリケーション名)になります。何のことかピンと来ない場合は、とりあえずartifactIdと同じ値を入れておきます。

さて、これでプロジェクトの設定が終わりました。このままサンプルアプリを作ることもできますが、軽くpom.xmlの書き方について説明します。

pom.xmlの内容について

pom.xmlはxmlで記述するプロジェクトの設定ファイルです。アプリケーションのビルドに関わる設定を記述します。

最初の3行はヘッダーです。4行目のmodelVersionも含めて固定の記述となります。

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

11行目から19行目のpropertiesは変数の設定をしています。16行目のように変数として設定した値はその後に${}で呼び出すことができます。今回の設定ファイルではversion.bom.eeの値はversion.serverと同じになっています。

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <version.server>8.0.0.GA-redhat-00009</version.server>
        <version.bom.ee>${version.server}</version.bom.ee>
        <version.plugin.wildfly>4.1.1.Final</version.plugin.wildfly>
        <version.plugin.war>3.3.2</version.plugin.war>
    </properties>

21行目から28行目のdependenciesタグには依存するライブラリを定義しています。今回はJBoss EAP 8.0が準拠しているjakartaee-api仕様のライブラリを入れています。これ以外にユーザー側で自由にライブラリを追加する事が可能です。

Mavenでは依存するライブラリはインターネット上から勝手に取得してきます。そのため、別途主導でローカルにダウンロードする必要はありません。

他の追加したいライブラリがある場合はMaven Central等で検索することもできます。

    <dependencies>
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>10.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

30行目から53行目のbuildタグではアプリケーションのビルド(コンパイル等)の設定を行っています。

今回は、sourceとtargetに11を入れています。これはOpenJDKの互換バージョンを指定しています。OpenJDK 11で動作できるようにコンパイルしています。2024年9月時点ではJBoss EAP 8.0では11と17で動作させることが可能です。今後のアップデートで21のサポートが追加される予定になっています。

    <build>
        <finalName>example</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <encoding>${project.encoding}</encoding>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>${version.plugin.war}</version>
            </plugin>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>${version.plugin.wildfly}</version>
            </plugin>
        </plugins>
    </build>

55行目から120行目では依存ライブラリをどこから取得するのかを定義しています。先ほど言ったとおりにmavenはインターネットに接続して依存ライブラリを取得します。Red Hatでもmavenを通じてライブラリを配布する仕組みを持っており、今回はRed Hatのサーバーへの接続および、Red Hatの設定を使用するように設定しています。

特に細かい値を覚える必要はなく、JBoss EAPで開発をする場合にはこういう設定が必要程度で大丈夫です。

なお、Red Hatのmavenリポジトリを使用していない場合でも本番サポートを受けることは可能ですが、細かい不具合を避けるために使用する事が推奨されます。

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.bom</groupId>
                <artifactId>jboss-eap-ee-with-tools</artifactId>
                <version>${version.bom.ee}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <repositories>
        <repository>
            <id>jboss-public-maven-repository</id>
            <name>JBoss Public Maven Repository</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
        <repository>
            <id>redhat-ga-maven-repository</id>
            <name>Red Hat GA Maven Repository</name>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>jboss-public-maven-repository</id>
            <name>JBoss Public Maven Repository</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>redhat-ga-maven-repository</id>
            <name>Red Hat GA Maven Repository</name>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

ここまでで今回使用するpom.xmlについてざっと説明しました。詳細を知りたい場合は、Mavenのドキュメントを参照してください。

maven.apache.org

ソースコードを書く

ここから実際にコーディングをしていきます。

HelloWorldServletクラスの作成

ServletというのはJakarta EEのウェブ仕様の名前です。Servletを使用する事でユーザーから受け取ったリクエストに対してレスポンスを返すことができます。

プロジェクトのsrc/mainを右クリックして、新規(W)からクラスを選択します。

新規クラスの作成

名前にHelloWorlsServlet、スーパークラスにjakarta.servlet.http.HttpServletを右側の参照から指定します。 指定したら完了ボタンを押します。

HelloWorldServletの作成

NOTE: 参照を押した場合に同じクラスが複数表示される場合があります。その場合はどれを選択しても大丈夫です。

HelloWorldServletの内容を次の内容に置き換えます。packageについては適切な値に変更してください。

package [元のファイルの値];

import java.io.IOException;
import java.io.PrintWriter;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/HelloWorld")
public class HelloWorldServlet extends HttpServlet {

    static String PAGE_HEADER = "<html><head><title>helloworld</title></head><body>";

    static String PAGE_FOOTER = "</body></html>";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter writer = resp.getWriter();
        writer.println(PAGE_HEADER);
        writer.println("<h1> Hello World! </h1>");
        writer.println(PAGE_FOOTER);
        writer.close();
    }
}

これはhtmlを生成してクライアントに返すプログラムです。Javaでプログラミングされているので内容を自由に変更することができます。@WebServlet("/HelloWorld")でこのプログラムが動作するURLを指定しています。

続いてjspファイルを作成します。上記のようにServletではJava言語の中にhtmlを埋め込みます。逆にjspではhtmlファイルの中にJava言語を埋め込むことができます。そのため、複雑なhtmlを返したい場合はServletよりもjspが多く使用されます。*2

フォルダ階層からsrc/main/webappを右クリックして、新規(W)->その他(O)を選択します。

jspの新規作成

ウィザードからJSPファイルを選択してダブルクリックします。

jspの新規作成

ファイル名にindex.jspを入力して完了を押します。

index.jspの作成

index.jspを以下のように編集します。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>こんにちは世界!</title>
</head>
<body>
    <h1>こんにちは世界!</h1>
    <p><%
out.println(new java.util.Date()); //ここだけjava言語で記載
%></p>
</body>

これで、アプリケーションの作成は終わりです。

JBoss EAPへのデプロイとデバッグ

ここまで終わったらアプリケーションをデプロイします。 Pleiades(Eclipse)ではJBoss Toolsを導入することでIDEからデバッグモードで起動することができます。

NOTE: JBoss Toolsの使い方自体はRed Hatではサポートしていません。

プロジェクトを右クリックして、デバッグ(D)->1.サーバーでデバッグを選択します。

サーバーでデバッグ

手動で新規サーバーを定義(M)からRed Hat JBoss Middlewareの下にあるJBoss AS, WildFly, & EAP Server Toolsを選択して次へを押します。

サーバータイプの選択

NOTE:複数出ている場合はどれを選択しても大丈夫です。現時点では依存ライブラリがローカルに存在しないため、仮のデータが表示されています。

依存ファイルのダウンロードが始まるので待ちます。※ダイアログが一番右にきてからもかなり時間がかかります。

サーバー設定のダウンロード

時間が経つとライセンス条項への同意画面が出るので、同意したうえで完了を押します。

フィーチャーライセンス

エラーになるので、一度キャンセルします。

エラー

Note: Red Hatではこの手順はサポートしていません。

裏側でインストールが続いているようなので、少し待ちます。右下に進捗が表示されています。

インストール中

時間が経つとオーソリティーの信頼画面が表示されるので、すべてのオーソリティーを信頼します。そしてインストールが進むのを待ちます。

オーソリティーの信頼

また、署名者の信頼画面が表示されるので信頼します。

アーティファクトの信頼

IDEの再起動を促されるので再起動します。

再起動

再起動したら先ほどの手順と同様に、プロジェクトを右クリックして、デバッグ(D)->1.サーバーでデバッグを選択すると開くがめんで、手動で新規サーバーを定義(M)を選択すると Red Hat JBoss Enterprise Application Platform 8.0が増えているのでそれを選択します。

このプロジェクトを実行するときは常にこのサーバーを使用(P)にもチェックを入れておきます。

サーバーでデバッグの選択

詳細な設定はデフォルトのまま次へを押します。

詳細な設定

ランタイムには前回インストールしたJBoss EAPのインストールフォルダを指定します。

ランタイムの設定

セキュリティの警告が表示された場合は許可を押します。

セキュリティの警告

※セキュリティの警告が表示された場合、ブラウザが自動で立ち上がりません。その場合は、Pleiadesのコンソール上の右上に赤いボタンが表示されているので、それを使って一度サーバーを停止し、再度サーバーを起動してください。

サーバーの停止

実行に成功するとブラウザが立ち上がり、jspの画面が表示されます。

jsp

URLにHelloWorldを付けることでServletの画面が表示されます。HelloWorldServletの@WebServletで指定したURLが使われています。

servlet

デバッグ

さて、デバッグしていきましょう。Servletもjspもホットデプロイができるようになっているので、修正するとそのまま反映されます。

HelloWorldServletの24行目を次のように修正して保存したうえで、画面にアクセスすると即座に変更されます。

writer.println("<h1> Hello World! </h1>");

writer.println("<h1> Hello World!!!! </h1>");

servletの変更

※変更されない場合は、ソースルックアップの設定を修正する必要があります。 デバッグウインドウからソースルックアップの編集(K)を選択し、

ソースルックアップの編集

自分自身のプロジェクトが入っていることを確認してください。

ソースルックアップパスの編集

jspについても変更してみて更新されることを確認してみてください。

デバッグモードではブレークポイントを設定することもできます。 ソースコードの左側をダブルクリックすることでブレークポイントを設定できます。

ブレークポイントの指定

この状態で、ブラウザの画面をF5で更新するとブレークポイントで処理が止まります。メモリ上の値がどうなっているか等を確認することができて便利です。 処理を再開したい場合はデバッグウインドウから停止しているスレッドを選択して再開を押してください。

再開

その一つ下の終了を押すことでサーバーをシャットダウンすることができます。コンソールの左上にあるボタンと同じ機能です。ホットデプロイ機能は完全ではないため、開発中には適時再起動することになります。

また、今回紹介する機能はIntelliJ IDEAやVSCodeでも似たような機能を使用する事ができます。お好きなエディタを使用する事が可能です。

Mavenを使用してのデプロイ

先ほどまではIDEからの操作について説明しました。次はコマンドライン(Maven)からの操作を説明します。 コマンドラインから操作をすることで自動化が行えるため、ある程度システム開発が進むと使用する事になります。

Note: Maven以外にもコマンドラインから操作する方法は多数あります。

MavenからデプロイするためにはEAPサーバーが立ち上がっている必要があります。

ひとつ前の記事の手順と同じように、binのフォルダの下にあるstandalone.batを起動します。

起動したら http://localhost:8080 にアクセスしてサーバーが立ち上がっていることを確認してください。

サーバー起動の確認

Eclipseから開いているプロジェクトのフォルダでコマンドプロンプトを開きます。場所がわからない場合はプロジェクトを右クリックしてプロパティを選択すると確認できます。

ロケーションの確認

mavenでコンパイルをする場合は以下のコマンドを実行します。*3

mvn package

ここからコンパイルしたものをJBoss EAPにデプロイしていきます。wildfly-maven-pluginを使用する事でデプロイできます。wildflyはJBoss EAPのアップストリーム製品(元になったOSS)で、互換性があるのでwildflyのツールをそのまま使用する事ができます。

先にサーバーにアクセスしてPleiades(Eclipse)からデプロイしたアプリケーションにアクセスできるか確認しましょう。

http://localhost:8080/example/ にアクセスしてみます。先ほどと同じ画面が表示されるはずです。

サーバーの画面

コマンドラインから以下のコマンドを実行します。このコマンドはサーバーにデプロイしたアプリケーションを削除します。

mvn wildfly:undeploy

ブラウザを更新するとアクセスできなくなります。

404

Note: JBoss EAPのコンソールのログに削除された旨が出力されています。

コマンドラインから次のコマンドを実行します。

mvn wildfly:deploy

また画面が表示されるようになります。

再デプロイ

Note: JBoss EAPのコンソールのログにデプロイされた旨が出力されています。

Mavenには他のコマンドもあります。何ができるのかについてはMavenのドキュメントを参照してください。

maven.apache.org

wildfly-maven-pluginの固有の機能についてはwildflyのページを参照してください。

docs.wildfly.org

なお、wildfly-maven-pluginの新しいバージョンも公開されていますが、JBoss EAPはwildflyの少し前のバージョンをベースに安定版として製品化されていますので最新のプラグインを使用するのではなく、EAPのドキュメントのページに書かれているバージョンを使用する事がおすすめです。

また、OpenShift上で動作させたい場合はJBoss EAP Maven プラグインを使用する事で追加のタスクを行うことができます。詳細については以下を参照してください。

rheb.hatenablog.com

まとめ

これでPleiades(Eclipse)を使用してJBoss EAP上でのアプリケーションを開発する準備が整いました。 ただ、環境が整っただけで中身はどうしていけばいい?というのがあると思います。 JBoss EAPはJakarta EE仕様に乗っ取っているのでJakarta EEの参考資料をそのまま使用する事ができます。

例えば、Jakarta EE Tutorialのページを使用する事で一通り学ぶことができます。(英語ですが・・・)

eclipse-ee4j.github.io

動くサンプルが欲しいという場合はjboss-eap-quickstartsを使用する事が可能です。

github.com

他にもJava EE時代の参考書もありますが、Java EEサーバーは長い間互換性が高く更新されてきたため、今でもパッケージ名の変更だけすれば、ほぼそのまま使用する事ができます。

この記事では簡単に初心者向けの概要という形でまとめました。

Jakarta EEは20年以上名前を変えながら使い続けられており、歴史も古くなり、新しい人がはじめるのにはなかなか敷居が高くなっています。初心者の人がなんとなく開発環境を構築できるようになってくれて開発ができるようになってくれると幸いです。

*1:一部他のバージョンを使用している場所もあります。

*2:また、これ以外にも多くのテンプレートライブラリが存在します。

*3:コンパイルしていない場合はデプロイできません

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