繁体   English   中英

io.netty.buffer.PooledByteBufAllocator的NoClassDefFoundError

[英]NoClassDefFoundError for io.netty.buffer.PooledByteBufAllocator

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

java.lang.NoClassDefFoundError:无法在com.datastax.driver.core.NettyOptions.afterBootstrapInitialized(NettyOptions.java:144)com.datastax.driver.core.Connection $ Factory.newBootstrap初始化类io.netty.buffer.PooledByteBufAllocator。 (Connection.java:903)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)com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)at com.datastax.driver.core.Cluster $ Manager.negotiateProtocolVersionAndConnect(Cluster.java:1631)at com。位于com.datastax.driver.cor的com.datastax.driver.core.Cluster.init(Cluster.java:160)中的datastax.driver.core.Cluster $ Manager.init(Cluster.java:1549) e.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)at info.archinnov.achilles.configuration.ArgumentExtractor.initConfigContext(ArgumentExtractor.java) :96)at info.archinnov.achilles.bootstrap.AbstractManagerFactoryBuilder.buildConfigContext(AbstractManagerFactoryBuilder.java:60),位于com.ds.db.cassandra的info.archinnov.achilles.generated.ManagerFactoryBuilder.build(ManagerFactoryBuilder.java:38)。 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一部分的类netty-buffer-4.0.56.Final.jar已经是类路径的一部分。

当我尝试从我的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 /应用/ javacontainer /资源中:/ opt / DS / SW /应用/ msgreader / lib目录/ *中:/ opt / DS / SW /应用/ msgreader /资源中:/ opt / DS / SW /应用/ 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 ,任何人都可以帮助我理解这个问题。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM