英文:
Error while running the docker image | JNI error
问题
我在运行 Docker 镜像时遇到了一个错误。我使用 Gradle 创建了一个核心 Java 应用程序,使用 docker build
命令创建 Docker 镜像,但在运行 Docker 镜像时出现以下错误:
错误:发生了 JNI 错误,请检查您的安装并重试
主线程中的异常 "main" java.lang.NoClassDefFoundError: org/apache/kafka/clients/consumer/Consumer
...
Caused by: java.lang.ClassNotFoundException: org.apache.kafka.clients.consumer.Consumer
...
我可以看到这个错误是由于缺少 Kafka 消费者库引起的,但我不明白在 Docker 文件中漏掉了什么导致了这个问题。
以下是 Dockerfile 的内容:
FROM openjdk:8
ADD build/libs/*.jar parallel.jar
RUN bash -c 'touch /parallel.jar'
ENTRYPOINT ["java", "-jar", "parallel.jar"]
在运行 docker build
命令之前,我确保运行了 gradle clean build
命令。
以下是我在 build.gradle
中使用的依赖项:
implementation "io.confluent.parallelconsumer:parallel-consumer-core:0.5.2.4"
implementation "org.apache.avro:avro:1.11.1"
implementation "io.confluent:kafka-avro-serializer:3.3.0"
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.codehaus.jackson:jackson-core-asl:1.9.13"
implementation "org.codehaus.jackson:jackson-mapper-asl:1.9.13"
implementation "org.apache.commons:commons-lang3:3.12.0"
implementation "org.slf4j:slf4j-simple:2.0.0"
implementation "me.tongfei:progressbar:0.9.3"
implementation 'org.awaitility:awaitility:4.2.0'
implementation("log4j:log4j:1.2.17")
希望这可以帮助您找出问题所在。
英文:
I am getting an error while running a docker image. I have created a core java application using gradle.
using docker build
command to create the docker image and while running the docker image I am getting the following error
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/kafka/clients/consumer/Consumer
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:650)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:632)
Caused by: java.lang.ClassNotFoundException: org.apache.kafka.clients.consumer.Consumer
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 7 more
I can see that the error is due to missing kafka consumer library, but I am not able to understand what I have missed in the docker file which is causing this issue.
Here is the dockerfile
FROM openjdk:8
ADD build/libs/*.jar parallel.jar
RUN bash -c 'touch /parallel.jar'
ENTRYPOINT ["java", "-jar", "parallel.jar"]
Before I ran the docker build
command, I made sure to run the gradle clean build
command.
Here are the dependencies I have used in build.gradle
implementation "io.confluent.parallelconsumer:parallel-consumer-core:0.5.2.4"
implementation "org.apache.avro:avro:1.11.1"
implementation "io.confluent:kafka-avro-serializer:3.3.0"
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.codehaus.jackson:jackson-core-asl:1.9.13"
implementation "org.codehaus.jackson:jackson-mapper-asl:1.9.13"
implementation "org.apache.commons:commons-lang3:3.12.0"
implementation "org.slf4j:slf4j-simple:2.0.0"
implementation "me.tongfei:progressbar:0.9.3"
implementation 'org.awaitility:awaitility:4.2.0'
implementation("log4j:log4j:1.2.17")
答案1
得分: 1
Gradle默认不包含依赖项。在容器外运行 java jar
时会出现相同的错误。
您需要使用阴影插件将依赖项打包到您的JAR中。
或者,不要手动编写Dockerfile...使用 jib-gradle-plugin
。此外,它将创建一个更优化的Docker镜像,不像阴影插件会创建Uber JAR那样。
英文:
Gradle doesn't include dependencies, by default. You'd get the same error when running java jar
outside of the container.
You need to use shadow plugin to get dependencies packaged in your JAR.
Alternatively, don't write a Dockerfile manually... Use jib-gradle-plugin
. Plus, it'll create a more optimized Docker image, which doesn't create an Uber JAR like the shadow plugin would.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论