JakartaEE 10 に備えよ -まずは 9.1 に移行しておくのが吉-

最近は、ウェブアプリの類は、意識して JakartaEE のお作法で書くようにしている。

といっても JavaEE の頃と大した違いがあるわけではない。

アイキャッチにあるように、これまで

javax.***

としていたところを

Jakarta.***

としているだけ。

これは、JakartaEE 9.1 では JavaEE の名前空間を変えただけ程度の変更に留まっているから。

だから、既存の JavaEE プロジェクトでも IDE などを使って javax → jakarta と「置換」すれば、ほぼ移行作業は完了する。

「ほぼ」と書いたのは、もちろん例外もあるから。

ここでハマったという人が多いようだが、

javax.sql.Datasource

は、このままでいい。

このパッケージは EE の仕様ではなくて SE の仕様なので、Jakarta に変更する必要はないから。

言われてみれば当たり前なのだが、脳死状態で移行していると気が付きにくいですね。

私も、小一時間ハマりましたw

JakartaEE 10 では、新機能も追加されるだろうから、今くらいの時期(ちなみにこれ書いているのは 2022/11)から移行しておいた方がいいでしょう。

JavaEE → JakartaEE 10 の移行は、一気にステージが二段階上がるようなものだから、まずはここで手がかりを作っておくのが吉、という読みです。

(参考)JakartaEE の XML ファイルのスキーマは、ここ参照。
9.1 → 10 で変化するところはけっこうある。
例えば web-app は 5.0 → 6.0 。

(追記)理屈の上では、現在(2022/12)使うべきは JakartaEE 10 なのだろうが、いくつかのアプリケーションサーバを試してみたが、hibernate 経由で clob を扱う際に不具合が出やすいという印象がある。
ちょっと慣れておく、アタリをつける程度の使用にとどめておいた方がいいかもしれない。

 

Java/Jakarta EE 対応サーバとは?

正式には、このページをご参照ください。

WildFly, GlassFish といった有名どころのほか、最近では中華系のアプリケーションサーバも Java/JkartaEE に対応しているようだ。

最近では payara (パイアラと読むらしいです。GlassFish の派生版)の話をたまに聞く。

ところで、たまに「特定の環境でビルドした war ファイルはどのアプリケーションサーバでも動くか?」という質問をうけるんですが、ほとんどの場合(特にシステムが複雑になればなるほど)、手直しなしでそのまま動くことはないです。

簡単なウェブアプリであっても設定などを微妙に変えないといけない場合がほとんどです。
Mac で GlassFish を動かす』あたりをご参照ください。

また、各アプリケーションサーバによって Java/JakartaEE のモジュールの実装が違うため(例えば、JAX-RS の実装は GlassFish では jersey、WildFly では resteasy がデフォルト)、この場合は、結構な量の手直しが必要です。

Mac で GlassFish を使う

WildFly, TomEE ときたので、ついでで GlassFish にも手を出してみる。

インストール

公式ページのここから適当なバージョンの GlassFish をダウンロード。(私は Ver 6.2.5 をチョイス。なお、環境は MacOS Monterey, java17 です)

解凍すれば使えるようにはなっている。

問題は置き場所だが、多分、ほとんどの人がまずはお試しで使うと思うので、/usr/local ではなく、ユーザーホームの適当なフォルダに配置すればいいと思う。

/glassfish6/bin

に移動して

./asadmin start-domain

でまずは起動。

ブラウザで localhost:4848 にアクセスして、以下のような画面が表示されればまずは GlassFish のインストール自体は成功しています。

Quick Start Guide, Application Development Guide, Create New JDBC Resource あたりの Documentation は要チェックかな。
ただし、説明が Ver5 に準拠しているため、若干の試行錯誤は必要そう。

次に簡単な war ファイルをデプロイしたいんだが、その前に・・・

GlassFish の port を変更

8080 ポートは、WildFly や Tomcat などで使用されている場合が多いと思うので、あらかじめ 80 に変更しておきたい。

これは上のコンソール画面から簡単に行える。

画面右のノードから configurations -> server-config -> Network Config -> Network Listners の順に展開。

下図の Port: 8080 のところを 80 に変更。

再起動が必要かと思ったが、その場で変更できるようだ。

実際、この状態で localhost:80 にアクセスすると

というウェブページが表示される。

ここらへん、Tomcat あたりと違う。

(追記)GlassFish では、実行環境の単位を domain と呼んでいるようだ。だから、start-domain なんですね。

簡単な war ファイルをデプロイする

適当なハロワでもいいんでしょうが、TomEE の時に使った async-servlet2 を流用。

(ソースコードは github にあげてあります)

NetBeans などの IDE でビルド。

ただし、今回は GlassFish が JakartaEE 9.1 に対応しているようなので、ソースの javax を jakarta に変更。

java も 1.8 から 17 に変更。

ビルド時の plugin も TomEE 関係は不要なので、コメントアウト。

async-servlet2.war が作成できたら、コンソール画面からデプロイしてみましょう(コマンドラインからもデプロイできるようですが、今回は GlassFish に慣れることが目的なので簡便にコンソール画面から)

コンソール画面左の Applications を展開して、右画面から war ファイルを投入。

このとき、コンテキストルートを指定しておきましょう

指定しておかないと ファイル名 + 謎の数字列 (async-servlet2134890 みたいな感じ) がコンテキストルートになってしまうようです。

デプロイできたら、localhost/async-servlet2/ にアクセス。

リンクを踏んで適当なパラメータを設定してさらに再読み込み。

2 x 4 = 8 の値がやや遅れて(非同期で遅延させているんですが、細かいことは割愛)ブラウザに表示されました。

狙い通りに動いてくれました。

順調、順調。

次はデータベースの利用でしょうか。

データベースを使う

データベースを利用した簡単なウェブアプリをデプロイしたい。

これも TomEE のところで作成した jpa-hibernate を流用する。

ただ、データベースユーザーを tomee さんにしてしまうとわけがわからなくなるので、PostgreSQL ユーザー glassfish さんを新たに作成、データベース glassfish の所有者とした。

JakartaEE なので、

JDBC Connection Pool → JDBC Resource

の順で設定していく。

やり方は色々あるようなんですが、ここもコンソール画面で押していきます。

まず jdbc ドライバにパスを通す(→これは不要でした。よくこのように説明してある記事を見かけますが、おそらく Java  業界で有名な寺田さんがブログでこのように説明したため(↓)、

誤って広まったと思われます。/domain/lib といういかにもなフォルダがあるわけですから、このやり方は不自然ですし、先に言及した documentation にもそんなことは一言も書かれていません。所定の位置に jdbc ドライバを設置しておけば glassfish は自動で認識してくれます)。

jdbc ドライバを登録した後は、以下の手順で設定。

JDBC Connection Pool の設定

glasfish データベースへの接続情報を JDBC Connection Pool (Pool 名は TestPool とした)に登録した後、Ping ボタンを押下して Ping Succeeded が返ってくれば OK です。

キモは Datasource Classname に org.postgresql.ds.PGSimpleDataSource を指定するところでしょうか。

一回でダメな時は、GlassFish 自体を再起動してください。

JDBC Resource の設定

JDBC Resource は、JDBC Connection Pool に TestPool を指定してあげれば OK です。
JNDI ネームは jdbc/test としました。

deploy

基本的には、前回と同様です。

ソースコードをビルドして、管理画面の Applications からデプロイ(deploy)。

ただし、persistence.xml で、transaction の platform を指定する必要があるようです。

  <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />

を加えてください。

これがないと、ビルドはできますが、デプロイ時や動作時に

DdlTransactionIsolatorJtaImpl could not locate TransactionManager to suspend any current transaction

Unable to build Hibernate SessionFactory

といったエラーが出ます。

動作確認

デプロイ後、localhost/(context root)/Test にアクセスすると

というページが表示されます。

title, director に適当な文字列を入れ、persist を押下。

PostgreSQL 側では、指定したデータベースのテーブルにこれら文字列が永続化されています。

めでたし、めでたし。

おわりに

java のアプリケーションサーバは色々ありますが、GlassFish は、やはり安心しますね。

 

追記

GlassFish は、WildFly と並ぶ JakartaEE の代表的なアプリケーションサーバーなので、業界からの関心も高い。

最近(2022/11〜)、富士通の Hiroki Sawamura さんが、開発者向けのメーリングリストに開発の進め方に関して一つの提案をしていた。

興味のある方は、メーリスに登録して一読することを勧める。

こういうのは、オープンソースの一つの在り方だよなあと。

知り合いの方々も関与しているのであまり悪口は言いたくはないが、「日本初のオープンソースの電子カルテ」プロジェクトはもう無茶苦茶だったよなあ。
OpenDolphin -wikipedia 風解説-』あたりの記事をご覧ください。

 

デプロイ不要?! WildFly でも bootable jar が作れるようになったらしい

ワイが勝手に JavaEE(JakartaEE) 勢のフラッグシップと思い込んでいる WildFly であるが、ちょっと前に 26 がリリースされた。

最近、あまりチェックしていなかったのだが、bootable jar が作成できるようになったらしい。

軽めのドキュメントも公開されていた。

ほんまかいな?とサンプルを試してみる。

HelloWorldEndpoint.java
package org.wildfly.plugins.demo.jaxrs;


import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;


@Path("/hello")
public class HelloWorldEndpoint {
    @GET
    @Produces("text/plain")
    public Response doGet() {
        return Response.ok("Hello from WildFly bootable jar!").build();
    }
}


としたとき、pom.xml を以下のように設定する。

pom.xml(抜粋)

   <artifactId>jaxrs</artifactId>
   (略)
   <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-jar-maven-plugin</artifactId>
                <configuration>
                    <feature-pack-location>wildfly@maven(org.jboss.universe:community-universe)#${version.wildfly}</feature-pack-location>
                    <layers>
                        <layer>jaxrs</layer>
                        <layer>management</layer>
                    </layers>
                    <excluded-layers>
                        <layer>deployment-scanner</layer>
                    </excluded-layers>
                    <plugin-options>
                        <jboss-fork-embedded>${plugin.fork.embedded}</jboss-fork-embedded>
                    </plugin-options>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
mvn pacakge

でビルド。

完了したら、

java -jar target/jaxrs-bootable.jar

とタイプ。

すると

といういかにも WildFly なロガー情報が流れる。

ブラウザで http:127.0.0.1:8080/hello アクセスすると

とちゃんと表示されました。

wildfly-jar-maven-plugin やるではないですかーw