You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器启动Spring Boot Jar遇java.lang.ClassNotFoundException问题排查

问题原因分析及修复方案

看起来你遇到了一个典型的Spring Boot可执行JAR在Docker容器中启动失败的问题——本地运行正常,但容器内抛出ClassNotFoundException。结合你提供的详细信息,我帮你梳理可能的原因和对应的修复步骤:

可能的原因

  1. Maven插件配置冲突:你的pom.xml同时配置了maven-jar-plugin和spring-boot-maven-plugin,其中maven-jar-plugin手动指定了mainClass,这可能和Spring Boot插件自动生成的启动配置产生隐性冲突,虽然最终的Manifest看起来正确,但打包过程中可能存在潜在问题。
  2. Docker镜像中的JAR文件异常:Dockerfile里的ADD命令使用了绝对路径源文件,可能导致构建时复制的JAR不是Spring Boot生成的FAT JAR,或者文件在复制过程中损坏。
  3. JDK版本兼容性问题:你本地使用的是OpenJDK 1.8.0_131,而Docker基础镜像java:8默认是Oracle JDK,虽然两者大多兼容,但某些老版本的Oracle JDK可能对Spring Boot的类加载逻辑有兼容性问题。
  4. JAR文件权限不足:容器内的JAR文件没有足够的读权限,导致Spring Boot的类加载器无法读取JAR内部的类文件。

分步修复方案

1. 优先排查Docker镜像中的JAR文件是否正确

先确认容器内的JAR是否包含目标类,运行以下命令进入容器检查:

docker run --rm -it apostx-cc-restapi-dev bash

在容器内执行:

jar -tvf /BackEndRestFunctionality-0.0.1-SNAPSHOT.jar | grep ccinfw/MainApplication.class

如果输出结果为空,说明JAR文件复制错误或损坏,需要调整构建配置;如果能找到该类,继续下一步。

2. 修正Maven插件配置,消除冲突

Spring Boot的spring-boot-maven-plugin会自动处理可执行JAR的打包逻辑,包括生成正确的Manifest和打包依赖,不需要maven-jar-plugin手动指定mainClass。修改你的pom.xml:

  • 移除maven-jar-plugin中的<archive>配置块:
<!-- 删掉这部分手动配置的mainClass -->
<archive>
  <manifest>
    <mainClass>ccinfw.MainApplication</mainClass>
  </manifest>
</archive>
  • 显式配置spring-boot-maven-plugin的repackage目标,确保它在打包阶段正确执行:
<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
</plugin>

重新执行Maven打包命令,生成新的JAR文件。

3. 调整Dockerfile的ADD命令及基础镜像

  • 修改Dockerfile中的ADD命令,避免使用绝对路径源文件,同时更换为和本地一致的OpenJDK镜像,确保环境兼容性:
FROM openjdk:8u131-jdk
ADD BackEndRestFunctionality-0.0.1-SNAPSHOT.jar /BackEndRestFunctionality-0.0.1-SNAPSHOT.jar
RUN chmod 644 /BackEndRestFunctionality-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "/BackEndRestFunctionality-0.0.1-SNAPSHOT.jar"]
  • 或者调整docker-maven-plugin的配置,让它自动生成正确的Dockerfile:
<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <configuration>
    <imageName>apostx-cc-restapi-dev</imageName>
    <baseImage>openjdk:8u131-jdk</baseImage>
    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>

4. 重新构建并测试

执行Jenkins中的Maven命令重新构建镜像,然后启动容器测试:

docker run apostx-cc-restapi-dev

内容的提问来源于stack exchange,提问作者Casey Harrils

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:40:17