使用Docker分层构建Spring Boot应用时遭遇Unable to access jarfile application.jar错误
Docker分层构建Spring Boot应用时遭遇Unable to access jarfile application.jar错误
我来帮你排查这个问题,从你给出的错误日志和Docker配置来看,核心问题大概率是jar包名称不匹配或者Spring Boot的可执行jar包未正确生成,下面是具体的分析和修复步骤:
1. 修正Dockerfile.layered中的jar包名称不匹配问题
从错误日志里能看到,构建时执行的命令是:
java -Djarmode=layertools -jar application.jar extract
但你贴的Dockerfile.layered里,明明是把target下的jar包重命名为了app.jar:
ADD target/*.jar app.jar
这就导致系统找不到application.jar——因为你已经把jar包改成app.jar了呀!
你需要把Dockerfile.layered里的RUN命令修正为和jar包名称一致:
RUN java -Djarmode=layertools -jar app.jar extract
确保这行命令里的jar名和ADD命令里的完全对应。
2. 确认Spring Boot的可执行jar包已生成
如果修正名称后还是报错,那可能是你的target目录下根本没有生成可执行jar包:
- 如果你用Maven构建,先在项目根目录执行:
(多模块项目请用mvn clean packagemvn clean install) - 如果你用Gradle构建,执行:
执行完后去gradle clean bootJartarget(Gradle是build/libs)目录看看,确认有带版本号的可执行jar包存在。
3. 避免通配符匹配错误(可选)
如果target目录下有多个jar包(比如原始jar和sources jar),用*.jar通配符可能会匹配到错误的文件,你可以直接指定具体的jar包名称,比如假设你的应用jar是api-gateways-0.0.1-SNAPSHOT.jar,修改ADD命令:
ADD target/api-gateways-0.0.1-SNAPSHOT.jar app.jar
4. 临时排查:验证jar包是否存在
如果还是不确定问题出在哪,可以在Dockerfile.layered的RUN命令前加一行查看目录的命令,确认jar包是否真的被复制到了容器里:
ADD target/*.jar app.jar RUN ls -l # 查看当前目录下的文件,确认app.jar存在 RUN java -Djarmode=layertools -jar app.jar extract
重新构建时就能看到目录里的文件列表,判断是否是复制环节出了问题。
备注:内容来源于stack exchange,提问作者Hello There
相关产品推荐
相关产品推荐

