NoClassDefFoundError for io.netty.buffer.PooledByteBufAllocator - PullRequest
0 голосов
/ 25 июня 2018

Я создал Cassandra Client, написанный с использованием отображения объектов Achilles в java (используя IntelliJ + Gradle). Мой клиент прекрасно работает локально в IntelliJ, но выдает исключение при развертывании в док-контейнере. В настоящее время я застрял с приведенным ниже исключением в моем док-контейнере.

java.lang.NoClassDefFoundError: Не удалось инициализировать класс io.netty.buffer.PooledByteBufAllocator at 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 (Необязательно.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.generated.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 уже является частью classpath.

Когда я пытался проверить что-то локально из моей Intellij IDE, все работало нормально. Но после развертывания я столкнулся с этой проблемой в моем док-контейнере.

Служба запускается в моем Docker-контейнере следующим образом:

Java-сервер -XX: HeapDumpPath = / Opt / DS / SRV / диагностика / msgreader-1589749851-2s89z.heapdump -Xmx614m -Xms614m -XX: MaxMetaspaceSize = 126M -XX: + HeapDumpOnOutOfMemoryError -XX: + UseG1GC -XX: CICompilerCount = 4 -XX: MaxGCPauseMillis = 1000 -XX: + DisableExplicitrSgn: X: X 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 / ресурсы: / OPT / DS / SW / приложения / javacontainer / Библиотека / * com.ds.msg.Server start

Из приведенного выше cmd вы можете заметить аргумент -cp , в котором упоминается путь к классу. И этот путь содержит netty-buffer-4.0.56.Final.jar.

Позже я обнаружил, что netty-all-4.0.51.Final.jar также является частью пути к классу, и этот jar также содержит тот же файл класса. Я даже пытался удалить банки со всеми возможными комбинациями. Но все же я сталкиваюсь с той же проблемой.

Даже в случае нескольких версий файла jar мы должны получить NoSuchMethodError , Может кто-нибудь помочь мне разобраться в проблеме.

1 Ответ

0 голосов
/ 25 июня 2018

Я наконец нашел ответ, вопрос в том, что я догадался в своем вопросе.Несколько версий одной и той же банки, вызвало сбой.Чтобы найти его, я использовал в своем файле 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 уже имел классы, необходимые для ахилловСопоставление объектов, мой проект начал работать над развертыванием.

Еще одна причина сбоя, даже после удаления дубликатов файлов JAR из контейнера Docker: (Hard) Перезапуск модуля, в свою очередь, создалновый модуль, который вытягивает тот же Dockerimage из репозитория Docker.

IntelliJ каким-то образом решает проблему PATH при локальном запуске: /

...