ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – io.netty.buffer.PooledByteBufAllocator的NoClassDefFoundError

2019-05-22 15:48:01  阅读:673  来源: 互联网

标签:java docker gradle cassandra intellij-14


我创建了一个用java中的Achilles Object映射编写的Cassandra客户端(使用IntelliJ Gradle).我的客户端在IntelliJ中本地工作正常,但在docker容器中部署时抛出异常.我目前在我的docker容器中遇到以下异常.

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

但是,类,io.netty.buffer.PooledByteBufAllocator是其中的一部分
netty-buffer-4.0.56.Final.jar已经是classpath的一部分.

当我尝试从我的Intellij IDE本地测试东西时,一切正常.
但是在部署之后,我在我的docker容器中遇到了这个问题.

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

java -server
-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 start

从上面的cmd中,您可以注意到提到类路径的-cp参数.此路径包含netty-buffer-4.0.56.Final.jar.

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

即使在jar文件的多个版本的情况下,我们应该得到NoSuchMethodError,任何人都可以帮助我理解这个问题.

解决方法:

我终于找到了答案,这个问题就是我在问题中猜到的.同一个罐子的多个版本导致了失败.为了找到它,我在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中尝试以下achilles时,事情进展顺利:

06003

由于netty-all-4.0.51.Final.jar已经有了achilles对象映射所需的类,我的项目开始进行部署.

失败的另一个原因,即使从docker容器中删除重复的jar文件后:
(硬)重新启动pod,然后创建一个新的pod,它从docker repo中提取相同的Dockerimage.

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

标签:java,docker,gradle,cassandra,intellij-14
来源: https://codeday.me/bug/20190522/1152833.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有