gradle 运行docker镜像时出错|JNI错误

643ylb08  于 2023-05-18  发布在  Docker
关注(0)|答案(1)|浏览(239)

我在运行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")
tgabmvqs

tgabmvqs1#

默认情况下,Gradle不包含依赖项。在容器外部运行java jar时,您会得到相同的错误。
您需要使用shadow插件来获取打包在JAR中的依赖项。
或者,不要手动编写Dockerfile...使用jib-gradle-plugin。另外,它将创建一个更优化的Docker镜像,它不会像影子插件那样创建一个Uber JAR。

相关问题