java.lang.NoSuchMethodError : io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;

标签 java playframework sbt aws-sdk playframework-2.5

我正在尝试使用“software.amazon.awssdk”%“dynamodb”%“2.10.33” 我的项目在 Play 框架 (Java) 上。

以下是项目配置简介

scalaVersion := "2.11.8"
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.14")
sbt.version=0.13.8

尝试从新包中排除 netty 依赖

("software.amazon.awssdk" % "dynamodb" % "2.10.33").excludeAll(ExclusionRule(organization =  "io.netty"))

该项目运行良好

"com.amazonaws" % "aws-java-sdk-core" % "1.10.52",
"com.amazonaws" % "aws-java-sdk-s3" % "1.10.52",
"com.amazonaws" % "aws-java-sdk-dynamodb" % "1.10.52"

升级到新的 AWS 库似乎会破坏该项目。 sbt编译返回成功 但是,sbt run 会导致上述错误。

java.lang.NoSuchMethodError:
> io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;


[info] Running the application with Aspectj Weaver
--- (Running the application, auto-reloading is enabled) ---

java.lang.NoSuchMethodError: io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;
        at io.netty.channel.AbstractChannel.newId(AbstractChannel.java:100)
        at io.netty.channel.AbstractChannel.<init>(AbstractChannel.java:72)
        at io.netty.bootstrap.FailedChannel.<init>(FailedChannel.java:33)
        at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:308)
        at io.netty.bootstrap.AbstractBootstrap.doBind(AbstractBootstrap.java:260)
        at io.netty.bootstrap.AbstractBootstrap.bind(AbstractBootstrap.java:227)
        at play.core.server.NettyServer.bind(NettyServer.scala:139)
        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:498)
        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)

附加依赖树: https://drive.google.com/file/d/1dVf8aJiv2i0Tscn2XEhETQ-ae3dgqfHk/view?usp=sharing

最佳答案

您正在尝试使用两个不兼容的 Netty 版本。这是不可能的。

升级到 Play 2.6 或更高版本可以解决此问题,原因有两个:

  1. Play 2.6 默认使用 akka-http 作为服务器
  2. Play 2.6 中的 Netty 是阴影的,因此您可以在项目中使用另一个依赖于 Netty 的库

编辑:AWS SDK仅使用Netty作为其默认http客户端,可以替换。

libraryDependencies ++= Seq(
  "software.amazon.awssdk" % "dynamodb" % "2.10.33" exclude("software.amazon.awssdk", "netty-nio-client")
)

关于java.lang.NoSuchMethodError : io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59349089/

相关文章:

Java:重写paintComponent以跳过一些绘画=奇怪的行为

java - vaadin 的 Invient 图表最大数据大小

jquery - 如何将 Play Framework 1.x 项目迁移到 2.0

json - 如何解析包含在 Scala 中始终更改名称的字段的 json?

scala - 添加reactivemongo后出现错误 "play-iteratees_2.10 not found"

java - 解析和映射具有动态属性的 JSON 对象

java - 为什么 ComboBoxModel<E> 返回对象而不是 E

java - 如何更新游戏框架中的对象?

scala - sbt - 对象 apache 不是包 org 的成员

java - 使用 Java 11 玩 2.2.2