io.netty.buffer.PooledByteBufAllocator的NoClassDefFoundError

时间:2018-06-25 11:41:50

标签: java docker gradle cassandra intellij-14

我创建了一个用Java中的Achilles Object映射编写的Cassandra Client(使用IntelliJ + Gradle)。我的客户端在IntelliJ中可以在本地正常工作,但是在docker容器中部署时会引发异常。我目前在docker容器中遇到以下异常。

  

java.lang.NoClassDefFoundError:无法初始化类   io.netty.buffer.PooledByteBufAllocator位于   com.datastax.driver.core.NettyOptions.afterBootstrapInitialized(NettyOptions.java:144)     在   com.datastax.driver.core.Connection $ Factory.newBootstrap(Connection.java:903)     在   com.datastax.driver.core.Connection $ Factory.access $ 100(Connection.java:751)     在com.datastax.driver.core.Connection.initAsync(Connection.java:139)     在   com.datastax.driver.core.Connection $ Factory.open(Connection.java:807)     在   com.datastax.driver.core.ControlConnection.tryConnect(ControlConnection.java:252)     在   com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:201)     在   com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)     在   com.datastax.driver.core.Cluster $ Manager.negotiateProtocolVersionAndConnect(Cluster.java:1631)     在com.datastax.driver.core.Cluster $ Manager.init(Cluster.java:1549)     在com.datastax.driver.core.Cluster.init(Cluster.java:160)处   com.datastax.driver.core.Cluster.connectAsync(Cluster.java:342)在   com.datastax.driver.core.Cluster.connectAsync(Cluster.java:317)在   com.datastax.driver.core.Cluster.connect(Cluster.java:259)在   java.util.Optional.orElseGet(Optional.java:267)在   info.archinnov.achilles.configuration.ArgumentExtractor.initSession(ArgumentExtractor.java:186)     在   info.archinnov.achilles.configuration.ArgumentExtractor.initConfigContext(ArgumentExtractor.java:96)     在   info.archinnov.achilles.bootstrap.AbstractManagerFactoryBuilder.buildConfigContext(AbstractManagerFactoryBuilder.java:60)     在   info.archinnov.achilles.genic.ManagerFactoryBuilder.build(ManagerFactoryBuilder.java:38)     在   com.ds.db.cassandra.AchillesClient。(AchillesClient.java:22)     在   com.ds.message.RabbitMQMsgClient $ 1.open(RabbitMQMsgClient.java:114)     在   org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(FunctionUtils.java:36)

但是类io.netty.buffer.PooledByteBufAllocator是其中的一部分 netty-buffer-4.0.56.Final.jar已经成为类路径的一部分。

当我尝试从Intellij IDE本地测试事物时,一切运行正常。 但是部署后,我在Docker容器中面临这个问题。

该服务在我的docker容器中启动,如下所示:

  

java-服务器   -XX:HeapDumpPath = / opt / ds / srv / diagnostics / msgreader-1589749851-2s89z.heapdump   -Xmx614m -Xms614m -XX:MaxMetaspaceSize = 126M -XX:+ HeapDumpOnOutOfMemoryError -XX:+ UseG1GC -XX:CICompilerCount = 4 -XX:MaxGCPauseMillis = 1000 -XX:+ DisableExplicitGC -XX:ParallelGCThreads = 4 -Dsun.net.inetaddr。 ttl = 60 -XX:OnOutOfMemoryError = kill -9%p -Djava.library.path = / usr / local / lib -Djava.net.preferIPv4Stack = true -Dapp.dir = / opt / ds / sw / apps / msgreader- Dserver.name = msgreader -Dlog.dir = / opt / ds / var / log / msgreader -cp / opt / ds / sw / apps / javacontainer / resources:/ opt / ds / sw / apps / msgreader / lib / *:/ opt / ds / sw / apps / msgreader / resources:/ opt / ds / sw / apps / javacontainer / lib / *   com.ds.msg.Server启动

在上面的cmd中,您会注意到 -cp 参数提到了类路径。并且此路径包含netty-buffer-4.0.56.Final.jar

我后来发现netty-all-4.0.51.Final.jar也是类路径的一部分,这个jar也包含相同的类文件。我什至尝试用所有可能的组合移除罐子。但是我仍然面临着同样的问题。

即使是jar文件的多个版本,我们也应该会收到 NoSuchMethodError ,有人可以帮助我理解该问题吗。

1 个答案:

答案 0 :(得分:4)

我终于找到了答案,这个问题就是我在问题中猜到的。同一罐子的多个版本导致了故障。为了找到它,我在gradle文件中使用了以下内容:

apply plugin: 'project-report'

然后跑

gradle htmlDependencyReport

它将为我们提供有关依赖项树的良好HTML报告。我们甚至可以使用下面的cmd,但是要在多模块gradle项目中进行后续跟踪将很困难

gradle dependencies

在HTML报告中,我发现 achilles-core 模块依赖于netty-buffer-4.0.56.Final.jar,而另一个模块依赖于netty-all-4.0.51.Final.jar。 因此,当我在 build.gradle 中尝试以下跟腱时,一切正常:

compile(group:'info.archinnov', name: 'achilles-core', version: '6.0.0'){
    exclude module: 'netty-buffer'
}

由于netty-all-4.0.51.Final.jar已经具有阿喀琉斯对象映射所需的类,所以我的项目开始进行部署。

即使从docker容器中删除了重复的jar文件,失败的另一个原因: (硬)重新启动容器,反过来又创建了一个新容器,该容器从docker仓库中提取了相同的Dockerimage。

IntelliJ在本地运行时如何解决PATH问题:/