GlassFish 5.1.0のArchive Path is NULLに対する対策

この記事は、オープンソフトウェアとして広く利用されているアプリケーションサーバのGlassFish 5.1.0を構築する機会があったので、そこで遭遇した「Archive Path is NULL」に関するバグの修正方法について備忘録として紹介しています。

RHEL 8.5にGlassFish 5.1.0をインストールする手順については、以下の記事で紹介しています。

GlassFish 5.1.0のArchive Path is NULLに対する対策

Eclipse FoundationからダウンロードしたGlassFish 5.1.0のドメイン管理サーバ(DAS)画面を利用して、Webアプリケーションを配備(デプロイ)しようとすると、以下のようなエラー表示が出現します。

この事象が発生している動作環境については、以下のとおりです。

$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)

$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

$ /opt/glassfish5/bin/asadmin version
Version = GlassFish Server Open Source Edition  5.1.0  (build default-private)
Command version executed successfully.

「Archive Path is NULL」エラーの原因と対策について紹介していきます。

Archive Path is NULLの原因

サーバログを確認してエラーの原因を確認します。

$ cd /opt/glassfish5/glassfish/domains/domain1/logs
$ cat server.log 

[2023-06-18T03:34:45.548+0000] [glassfish 5.1] [INFO] [] [org.glassfish.admingui] [tid: _ThreadID=48 _ThreadName=admin-listener(3)] [timeMillis: 1687059285548] [levelValue: 800] [[
  GUI deployment: uploadToTempfile]]

[2023-06-18T03:34:45.551+0000] [glassfish 5.1] [INFO] [] [org.glassfish.admingui] [tid: _ThreadID=48 _ThreadName=admin-listener(3)] [timeMillis: 1687059285551] [levelValue: 800] [[
  deploy(): origPath is NULL]]

GUIからアプリケーションをデプロイしてエラーとなったタイミングで「deploy(): origPath is NULL」がサーバログに記録されていました。どうやら、デプロイするアプリケーションのファイルパスが正しく取得できていないようです。

この問題は、既知の問題として以下で取り上げられていました。

https://github.com/eclipse-ee4j/glassfish/issues/22739

この記事によると、2020年6月にバグ修正のプルリクエストが承認されているようですが、2023年6月時点でダウンロード可能なGlassFish 5.1.0には、バグ修正が反映されていません。

GlassFish 5.1.1もリリースされていないところをみると、この先も修正版がリリースされる可能性はかなり低そうです。

自力で修正するしかなさそう

GlassFish 5.1.0の既知のバグに対する修正リリースを待っていられないので、自力で修正していきます。

修正すべきソースコードは、/opt/glassfish5/glassfish/modules/console-common.jarの中に含まれています。console-common.jarを展開すると、applicationsフォルダの中にuploadFrame.jsfファイルがあるので、こちらを修正していきます。

uploadFrame.jsfファイルの45行目を次のように修正します。

uploadFrame.jsf 45行目

【修正前】
    <sun:form id="form">

【修正後】
    <sun:form id="form" enctype="multipart/form-data">

修正できたら、/opt/glassfish5/glassfish/modules/console-common.jarのapplicationsフォルダにuploadFrame.jsfファイルを戻します。

jarファイルの扱い方については割愛しますが、jarファイルは単なるzipファイルであるため、ファイルの拡張子をjarからzipに変更することでzipで解凍できるようになります。

Windowsであれば、7zipを使って開くのもありだと思います。7zipでjarの中を直接開いたり、ファイルを取り出したりすることができ、何よりも簡単なので是非試してみてください。

修正できたか確認してみる

では、修正したGlassFish 5.1.0を起動して、アプリケーションがデプロイできるか確認してみます。

エラー表示は出ていません。サーバログを確認してみます。

[2023-06-18T05:27:53.416+0000] [glassfish 5.1] [INFO] [] [org.glassfish.admingui] [tid: _ThreadID=170 _ThreadName=admin-listener(7)] [timeMillis: 1687066073416] [levelValue: 800] [[
  GUI deployment: uploadToTempfile]]

[2023-06-18T05:27:53.435+0000] [glassfish 5.1] [INFO] [] [org.glassfish.admingui] [tid: _ThreadID=170 _ThreadName=admin-listener(7)] [timeMillis: 1687066073435] [levelValue: 800] [[
  uploadFileName=sample_test.war]]

[2023-06-18T05:27:53.442+0000] [glassfish 5.1] [INFO] [] [] [tid: _ThreadID=170 _ThreadName=Thread-8] [timeMillis: 1687066073442] [levelValue: 800] [[
  ================== availabilityEnabled  skipped ]]

[2023-06-18T05:27:53.561+0000] [glassfish 5.1] [INFO] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=46 _ThreadName=admin-listener(1)] [timeMillis: 1687066073561] [levelValue: 800] [[
  visiting unvisited references]]

[2023-06-18T05:27:53.745+0000] [glassfish 5.1] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=46 _ThreadName=admin-listener(1)] [timeMillis: 1687066073745] [levelValue: 800] [[
  sample_test was successfully deployed in 265 milliseconds.]]

[2023-06-18T05:27:53.767+0000] [glassfish 5.1] [INFO] [] [org.glassfish.admingui] [tid: _ThreadID=170 _ThreadName=admin-listener(7)] [timeMillis: 1687066073767] [levelValue: 800] [[
  Deleting the file uploaded to Temp Directory]]

アプリケーションのデプロイが正常に処理されたことが確認できました。

まとめ

GlassFish 5.1.0は、2018年にEclipse Foundationからリリースされました。2023年時点でもJava EE 8と互換性のあるJakarta EE 8のリファレンス実装として広く利用され続けています。

GlassFish 5.1.0以降のバージョンのリリースについては確認されていないため、新規開発の場合は、Jakarta EE 9以上の利用を検討した方がよさそうです。

レガシーシステムなどの開発でJakarta EE 8をどうしても利用する必要がある場合は、GlassFish 5.1.0が正しく動作可能なOSとOpenJDKの組み合わせなどを考慮しなければなりません。

Payara Server Community EditionもJakarta EE 8互換のアプリケーションサーバであるため、選択肢に含めて検討されるとよいかもしれません。こちらは、機会があれば検証してみたいとおもいます。

参考になれば幸いです。

システムのお悩みについてご相談ください

本サイトの掲載内容に関するお問い合わせは、こちらから承ります。
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。