Docker运行Java容器查看日志报找不到EazyBankApplication主类错误
错误原因
你的Dockerfile存在两个核心问题,直接触发主类找不到的报错:
- 直接复制了
src/main/java下的Java源代码到镜像中,openjdk:17是Java运行时镜像,不包含源码编译能力,容器内根本不存在编译完成的EazyBankApplication.class文件,JVM自然找不到要加载的主类。 - 你的启动类属于
com.eazybank包,全限定类名是com.eazybank.EazyBankApplication,就算你提前把源码编译成class文件,直接在/eazyApp目录执行java EazyBankApplication,也会因为类路径和全限定类名不匹配触发类找不到错误,这也是你之前补目录路径依然报错的核心原因。
修复方案
不要直接复制源码到运行时镜像里,推荐用本地打包+镜像运行jar或者多阶段构建的方式处理。
方案1:本地打包后构建镜像(适合本地调试,操作最简单)
- 先在项目根目录执行构建工具的打包命令:Maven项目执行
mvn package -DskipTests,Gradle项目执行gradle build -x test,确认target(Maven)或者build/libs(Gradle)目录下生成了可执行jar包。 - 替换Dockerfile为如下内容,注意把jar包名称替换成你实际生成的文件名:
FROM openjdk:17 RUN mkdir /eazyApp # 复制打包好的可执行jar到镜像内 COPY ./target/eazybank-0.0.1-SNAPSHOT.jar /eazyApp/app.jar WORKDIR /eazyApp # 启动命令直接运行jar包 CMD ["java", "-jar", "app.jar"]
- 重新构建镜像、启动容器即可正常运行。
方案2:多阶段构建(推荐生产使用,镜像体积更小)
不需要本地提前打包,镜像构建过程中自动完成编译打包,最终运行镜像只保留运行时环境和打好的jar包,Dockerfile参考如下:
# 第一阶段:构建环境,用带Maven的JDK镜像完成编译打包 FROM maven:3.9-openjdk-17-slim AS build WORKDIR /app # 先复制pom文件下载依赖,利用Docker构建缓存减少重复构建时间 COPY pom.xml . RUN mvn dependency:go-offline -B # 复制源码执行打包 COPY src ./src RUN mvn package -DskipTests -B # 第二阶段:运行环境,只复制打好的jar包,大幅压缩镜像体积 FROM openjdk:17-slim WORKDIR /eazyApp COPY --from=build /app/target/*.jar app.jar CMD ["java", "-jar", "app.jar"]
注意事项
不要尝试直接在openjdk基础镜像里跑.java源码,也不要手动拼接class路径去运行单个class文件,从类名判断你写的是SpringBoot项目,打包后的可执行jar已经内置了所有依赖和正确的启动类配置,直接用java -jar启动是最稳定的方式。
内容的提问来源于stack exchange,提问作者Aikay
相关产品推荐
相关产品推荐

