gpt4 book ai didi

java - 当我构建Docker镜像时,Gradle测试由于UnsupportedClassVersionError而失败-在本地运行良好

转载 作者:行者123 更新时间:2023-12-03 05:20:20 48 4
gpt4 key购买 nike

我在测试执行过程中抛出了java.lang.UnsupportedClassVersionError错误,这是一个问题。我理解错误并在之前解决了该错误,但是在这种情况下,我有点迷路了。
这是错误消息(对于所有测试类都会出现):

java.lang.UnsupportedClassVersionError: com/game/backend/resolver/QueryResolverTest has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
这是我的Dockerfile:
FROM gradle:6.6.1-jdk8 as builder
USER root
WORKDIR /builder
ADD . /builder
RUN gradle build --debug

FROM openjdk:11.0.8-slim
WORKDIR /app
EXPOSE 8082
COPY --from=builder /builder/build/libs/game-backend.jar app.jar
CMD ["java", "-jar", "app.jar"]
我在这里不明白的是为什么他说这是 compiled by a more recent versionFROM gradle:6.6.1-jdk8告诉我它是JDK 1.8,这意味着它是类文件版本 52 (根据: List of Java class file format major version numbers?)。那么,为什么要说该类是由 55 (Java 11)编译的呢?

最佳答案

好吧,我在这里表现得有些冷漠。即使docker image FROM gradle:6.6.1-jdk8实际上是JDK 1.8也不意味着gradle可以与JDK 1.8一起编译。
所以我现在使用JDK 11将其更改为FROM gradle:6.6.1-jdk11 as builder。为什么现在有帮助?
我的build.gradle.kt正在使用:

...
java.sourceCompatibility = JavaVersion.VERSION_11
...
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "11"
}
}
...
显然,这表明gradle可以使用JDK 11来 编译我的类。但是我认为只有Docker镜像FROM(即JDK8)给出的JDK可用,并且gradle应该告诉我类似的东西

You wanted to build with JDK 11, since that's what your build.gradle says but you only have JDK 8 available (through the gradle:6.6.1-jdk8) image.


但是我忘了gradle本身可以下载东西。这是合乎逻辑的,因为它正在下载依赖项。因此,它似乎也下载了需要根据build.gradle进行编译的JDK(在本例中为11)。但是,在运行时,测试使用的是 Java运行时环境,它是由gradle:6.6.1-jdk8引入的,因此是JRE 8而不是JRE(这是必需的,因为它全部由gradle编译为11)。

关于java - 当我构建Docker镜像时,Gradle测试由于UnsupportedClassVersionError而失败-在本地运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63782164/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com