🕌

JakartaEEのStarterで発生した例外への対処

2022/05/11に公開

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