JakartaEEのStarterで発生した例外への対処
JakartaEEのStarterとは
私はきしだなおきさんのブログで知ったのですが、ECLIPSE STARTER FOR JAKARTA EEというものがあります。これは、JakartaEE(Java標準のWebアプリケーションフレームワーク)を使ったアプリケーションの雛形のようなものです。Springで言うとSpring Initializrのようなものです。
発生した例外
ECLIPSE STARTER FOR JAKARTA EEに書いてある手順の通りに実行したところ、例外が発生しました。きしださんのブログを見るとテストで例外が発生したようですが、私の場合はテストではなく別の箇所で発生しました。
ログ
[2022-05-11T05:36:57.296+0900] [] [重大] [] [com.hazelcast.instance.impl.Node] [tid: _ThreadID=25 _ThreadName=RunLevelControllerThread-1652215014835] [timeMillis: 1652215017296] [levelValue: 1000] [[
[fe80:0:0:0:1c00:8aff:fe0a:de24]:6900 [development] [4.2] Can't assign requested address
java.net.SocketException: Can't assign requested address
at java.base/java.net.PlainDatagramSocketImpl.join(Native Method)
・
・
・
[2022-05-11T05:36:57.300+0900] [] [重大] [] [com.hazelcast.instance.impl.Node] [tid: _ThreadID=25 _ThreadName=RunLevelControllerThread-1652215014835] [timeMillis: 1652215017300] [levelValue: 1000] [[
[fe80:0:0:0:1c00:8aff:fe0a:de24]:6900 [development] [4.2] Node creation failed
com.hazelcast.core.HazelcastException: Starting the MulticastService failed
at com.hazelcast.internal.cluster.impl.MulticastService.createMulticastService(MulticastService.java:150)
・
・
・
[2022-05-11T05:36:57.448+0900] [] [重大] [] [fish.payara.micro.PayaraMicro] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1652215017448] [levelValue: 1000] [[
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
・
・
・
Caused by: org.glassfish.embeddable.GlassFishException: Server failed to start
at com.sun.enterprise.v3.server.AppServerStartup.doStart(AppServerStartup.java:247)
at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:226)
... 14 more
]]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.670 s
[INFO] Finished at: 2022-05-11T05:36:57+09:00
[INFO] ------------------------------------------------------------------------
BUILD SUCCESS
と出力されたものの、サーバーは起動しませんでした。コンソールに出力されたログから推察するに、Starterで使用しているPayara Microの起動時に例外が発生しているようでした。試しにPayara Microを単体でDownloadして、アプリケーションをデプロイせずにjava -jar payara-micro-5.2022.2.jar
と単純に起動してみましたが、同じ例外が発生しました。
例外の原因(結局よくわからず)
PayaraサーバーではHazelcastというものを使用しています。複数台のマシン間でリアルタイムにデータを共有する仕組みです。このHazelcastのクラスター(データを共有するグループのようなもの)を構築する際に例外が発生しているようです。Hazelcastで使用するポート番号6900が既に使われていたのかを疑いましたが、lsofコマンドで調べても特に使われてはおらず、IPアドレスがIPV6で何やらよくわからないところ(M1 Macでifconfigしたときにanpi0と表示されるところ)を指していて、そこを確保できないのだろうと推測しました。原因がはっきり特定できなかったのであきらめました。
対処
Hazelcastのクラスターを構築しないよう、PayaraMicro起動時のオプションに--noclusterを指定しました。Payara Micro Maven Pluginのページを参照して、pom.xmlに以下の行を追加しました。
pom.xml
・
・
・
<configuration>
<artifactItem>
<groupId>fish.payara.extras</groupId>
<artifactId>payara-micro</artifactId>
<version>5.2022.2</version>
</artifactItem>
<deployWar>true</deployWar>
<contextRoot>/</contextRoot>
<!-- ▼commandLineOptionsを追加しました -->
<commandLineOptions>
<option>
<key>--nocluster</key>
</option>
</commandLineOptions>
<!-- ▲commandLineOptionsを追加しました -->
</configuration>
</plugin>
</plugins>
ECLIPSE STARTER FOR JAKARTA EEにはDockerを使った手順も書かれていて、Dockerを使うことでも問題を回避できそうでしたが、M1 Mac(Arm)用のDockerImageがDockerhubに登録されておらず、自分でDockerfileを頑張って書く気力がなくてやめてしまいました。
Discussion