play framework (< v2.6)で aws sdk for java を利用しているとrunで実行エラー

古い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のバージョンも古いからアップデートしないと...

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.