我创建了一个用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 ,有人可以帮助我理解该问题吗。
答案 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问题:/