【问题标题】:java.lang.NoClassDefFoundError when trying to run gradle build尝试运行 gradle build 时出现 java.lang.NoClassDefFoundError
【发布时间】:2022-10-02 00:56:04
【问题描述】:

我正在尝试从 Dockerfile 运行 java 应用程序。 Dockerfile 如下所示:

FROM gradle:7.2-jdk17-alpine AS build

COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon

FROM openjdk:17

EXPOSE 7070

RUN mkdir /app
COPY --from=build /home/gradle/src/build/libs/*.jar /app/app.jar

ENTRYPOINT [\"java\", \"-jar\", \"/app/app.jar\"]

容器构建映像,但是当我尝试运行容器时,出现错误:

Exception in thread \"main\" java.lang.NoClassDefFoundError: com/mongodb/client/MongoClients

我的 build.gradle 有问题吗?

plugins {
    id \'java\'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation \'io.javalin:javalin:4.6.4\'
    implementation \'org.slf4j:slf4j-simple:1.8.0-beta4\'
    implementation \'com.fasterxml.jackson.core:jackson-databind:2.13.3\'
    implementation \'org.mongodb:mongodb-driver-sync:4.7.1\'
    implementation \'io.jsonwebtoken:jjwt-api:0.11.5\'
    implementation \'io.jsonwebtoken:jjwt-impl:0.11.5\'
    implementation \'io.jsonwebtoken:jjwt-jackson:0.11.5\'
    implementation \'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3\'
    implementation \'org.apache.poi:poi:5.2.2\'
    implementation \'org.apache.poi:poi-ooxml:5.2.2\'
    testImplementation \'org.junit.jupiter:junit-jupiter-api:5.9.0\'
    testImplementation \'org.mockito:mockito-core:4.7.0\'
    testImplementation \'com.tngtech.archunit:archunit-junit5:0.23.1\'
    testRuntimeOnly \'org.junit.jupiter:junit-jupiter-engine:5.9.0\'
}

test {
    useJUnitPlatform()
}

jar {
    manifest {
        attributes(
                \'Main-Class\': \'packagename.Application\'
        )
    }
}

  • 在尝试使用 docker 之前,您是否运行过这个应用程序?
  • @YJR 是的,使用 IntelliJ。
  • 如果您构建项目并直接尝试使用 java -jar <jar_name> 运行 jar,会发生什么情况?
  • @akortex 我得到一个不同的错误:java.lang.UnsupportedClassVersionError

标签: java docker gradle


【解决方案1】:

经过数小时的谷歌搜索,我更新了我的 build.gradle:

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'io.javalin:javalin:4.6.4'
    implementation 'org.slf4j:slf4j-simple:1.8.0-beta4'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
    implementation 'org.mongodb:mongodb-driver-sync:4.7.1'
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
    implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
    implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3'
    implementation 'org.apache.poi:poi:5.2.2'
    implementation 'org.apache.poi:poi-ooxml:5.2.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
    testImplementation 'org.mockito:mockito-core:4.7.0'
    testImplementation 'com.tngtech.archunit:archunit-junit5:0.23.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
}

test {
    useJUnitPlatform()
}

jar {
    manifest {
        attributes(
                'Main-Class': 'packagename.Application',
                'Class-Path': '/libs/*.jar'
        )
    }
}

要构建我知道的 jar,请使用 ./gradlew --no-daemon shadowJar。这对我行得通。希望这可以帮助某人:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2018-09-03
    • 2021-05-14
    相关资源
    最近更新 更多