Dee*_*pak 6 java gradle cassandra docker intellij-14
我创建了一个用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
一部分的类已经是类路径的一部分.
当我尝试从我的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'
Run Code Online (Sandbox Code Playgroud)
跑了
gradle htmlDependencyReport
Run Code Online (Sandbox Code Playgroud)
它将为我们提供有关依赖项树的良好HTML报告。我们甚至可以使用下面的cmd,但是在多模块gradle项目中很难跟进
gradle dependencies
Run Code Online (Sandbox Code Playgroud)
在HTML报告中,我发现achilles-core模块依赖netty-buffer-4.0.56.Final.jar
,另一个模块依赖netty-all-4.0.51.Final.jar
。因此,当我在build.gradle中尝试以下解决方案时,一切运行正常:
Run Code Online (Sandbox Code Playgroud)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问题:/
归档时间: |
|
查看次数: |
916 次 |
最近记录: |