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

标签 java docker kotlin gradle

我在测试执行过程中抛出了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/

相关文章:

java - 为什么只有一个 Spark 作业仅使用一个执行器运行?

java - MersenneTwister 随机数生成器

docker - Docker 在构建镜像时如何使用缓存

docker - Bitbucket Pipelines - mvn clean install 不适用于 JavaFX

java - LocalDate epochDay 格式为休息一天

java - 使用 SmartGWT 使用 REST 服务

java - 与 MacBook Pro 上的 64 位 Eclipse 不兼容的 JVM 错误消息

ubuntu - Docker 镜像 Ubuntu 14.04 未连接互联网

android - Kotlin:如何在类中使用多个泛型?

android - 自定义偏好 Android Kotlin