我在运行Docker镜像时遇到错误。我用gradle创建了一个核心java应用程序。
使用docker build
命令创建docker镜像,在运行docker镜像时,我得到以下错误
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
我可以看到错误是由于缺少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")
1条答案
按热度按时间tgabmvqs1#
默认情况下,Gradle不包含依赖项。在容器外部运行
java jar
时,您会得到相同的错误。您需要使用shadow插件来获取打包在JAR中的依赖项。
或者,不要手动编写Dockerfile...使用
jib-gradle-plugin
。另外,它将创建一个更优化的Docker镜像,它不会像影子插件那样创建一个Uber JAR。