古いplay framework (v2.5.x)を使っていて、久しぶりにactivator clean run
したらで下記のExceptionが発生して2日ほどハマってしまったので、メモ。
NullPointerException
java.lang.NullPointerException
at io.netty.channel.group.DefaultChannelGroup.add(DefaultChannelGroup.java:146)
at play.core.server.NettyServer.bind(NettyServer.scala:140)
at play.core.server.NettyServer.play$core$server$NettyServer$$bindChannel(NettyServer.scala:224)
at play.core.server.NettyServer$$anonfun$1.apply(NettyServer.scala:216)
at play.core.server.NettyServer$$anonfun$1.apply(NettyServer.scala:216)
at scala.Option.map(Option.scala:146)
at play.core.server.NettyServer.<init>(NettyServer.scala:216)
at play.core.server.NettyServerProvider.createServer(NettyServer.scala:279)
at play.core.server.NettyServerProvider.createServer(NettyServer.scala:278)
at play.core.server.DevServerStart$$anonfun$mainDev$1.apply(DevServerStart.scala:235)
at play.core.server.DevServerStart$$anonfun$mainDev$1.apply(DevServerStart.scala:65)
at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
at play.core.server.DevServerStart$.mainDev(DevServerStart.scala:64)
at play.core.server.DevServerStart$.mainDevHttpMode(DevServerStart.scala:54)
at play.core.server.DevServerStart.mainDevHttpMode(DevServerStart.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at play.runsupport.Reloader$.startDevMode(Reloader.scala:234)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.devModeServer$lzycompute$1(PlayRun.scala:74)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.play$sbt$run$PlayRun$$anonfun$$anonfun$$anonfun$$devModeServer$1(PlayRun.scala:74)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.apply(PlayRun.scala:100)
at play.sbt.run.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$2$$anonfun$apply$3.apply(PlayRun.scala:53)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
[trace] Stack trace suppressed: run last application/compile:run for the full output.
[error] (application/compile:run) java.lang.reflect.InvocationTargetException
[error] Total time: 4 s, completed 2018/03/18 12:27:47
原因
- AWS SDK for Java(プロジェクトで利用している)の v1.11.238 で依存ライブラリに下記Nettyが追加されて、play framework (v2.5.x)でデフォルトで利用しているNetty Server と競合したため。
pom.xml
<!-- Netty is used by Kinesis Video -->
<netty.version>4.1.17.Final</netty.version>
参考:https://github.com/aws/aws-sdk-java/blame/master/pom.xml#L207
解決方法
- build.sbtのAWS SDK for JavaのところからNettyを除外。
build.sbt
// 変更前
libraryDependencies += "com.amazonaws" % "aws-java-sdk" % "1.11.+"
build.sbt
// 変更後
libraryDependencies += "com.amazonaws" % "aws-java-sdk" % "1.11.+" excludeAll(ExclusionRule(organization ="io.netty"))
※ AWS SDK内のKinesis Video でNetty v4.1.17.Final を利用していると思うが、わたしのプロジェクトではKinesis Videoは使っていないため、上記のように除外しました。
sbtのplugin dependencyTree で1つ1つ関連ありそうなものを見て、なんとかわかった感じでした。play framework 初心者だからなのかもしれないが。
もう、ActivatorもEOLだし、playのバージョンも古いからアップデートしないと...