Mac下Docker运行Spring Boot应用出现Java类版本不兼容报错如何解决
问题根因
- 报错中的类版本号有明确对应关系:
55.0是Java 11编译生成的类文件版本,52.0是Java 8运行环境支持的最高类文件版本 - 本地编译Spring Boot项目时使用的JDK版本为Java 11及以上,但Dockerfile中引用的基础镜像
openjdk:alpine默认搭载Java 8运行环境,容器内运行时的JRE版本低于代码编译的JDK版本,因此触发版本不兼容错误。
修复方案
有两种可行修复方案,按需选择即可:
方案1:将Docker基础镜像的Java版本和本地编译版本对齐(推荐)
直接修改Dockerfile中的基础镜像为对应Java版本的openjdk镜像即可,以本地编译使用Java 11为例,修改后的Dockerfile内容如下:
FROM openjdk:11-jre-alpine EXPOSE 8081 ARG JAR_FILE=target/report-0.0.1-SNAPSHOT.jar ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
如果本地编译使用的是更高版本的Java(比如Java 17),将镜像标签替换为openjdk:17-jre-alpine即可。
方案2:将项目编译的Java版本下调至和镜像一致
如果不想调整Docker镜像,可以将Spring Boot项目的编译版本指定为Java 8。
如果使用Maven管理项目,修改pom.xml配置:
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <!-- 注意:Spring Boot 3+最低要求Java 17,选择该方案请勿使用Spring Boot 3+版本 --> </properties>
如果使用Gradle管理项目,修改build.gradle配置:
java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 }
补充注意
你当前使用的docker.sh脚本中包含docker system prune -a命令,该命令会删除所有未被使用的镜像、容器、网络和存储卷,执行前请确认没有需要保留的本地Docker资源,避免误删。
内容的提问来源于stack exchange,提问作者riki
相关产品推荐
相关产品推荐

