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 風解説-』あたりの記事をご覧ください。