java – io.netty.buffer.PooledByteBufAllocator的NoClassDefFoundError
作者:互联网
我创建了一个用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