Docker容器中Spring Boot应用读取资源文件失败求助
问题分析与解决方案
核心问题
运行容器时抛出FileNotFoundException,找不到src\main\resources\anaplan-connector-393817-7f22b1ca301b.json文件,根源有两点:
- Spring Boot打包成Jar后,
src/main/resources下的文件会被放入Jar包根目录,而非保留原src路径结构,直接用File类读取原路径必然失败 - 容器是Linux环境,Windows路径分隔符
\无法识别,且Jar包属于压缩文件,不能通过普通文件系统路径访问内部资源
具体解决步骤
1. 修改代码的资源读取方式
替换原FileReader读取逻辑,改用Spring Boot推荐的类加载器读取Jar内资源:
// 原错误代码 // FileReader reader = new FileReader("src\\main\\resources\\anaplan-connector-393817-7f22b1ca301b.json"); // 修改后的代码 InputStream inputStream = ClientAppApplication.class.getResourceAsStream("/anaplan-connector-393817-7f22b1ca301b.json"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
这种方式既兼容IDE运行环境,也支持Jar包运行场景。
2. 确认构建工具打包时包含资源文件
检查Maven/Gradle配置,确保src/main/resources下的.json文件被打包进Jar:
- Maven(pom.xml):确保资源配置正确(默认已包含,若有自定义配置需检查)
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.json</include> </includes> </resource> </resources> </build>
- Gradle(build.gradle):
sourceSets { main { resources { include '**/*.json' } } }
3. 优化Dockerfile(可选但推荐)
当前Dockerfile中ADD . .会复制整个项目文件到容器,冗余且没必要,只需复制构建好的Jar包即可:
FROM openjdk:11 EXPOSE 8080 WORKDIR /usr/local/bin/ClientApp # 仅复制Jar包到容器 COPY target/ClientApp-0.0.1-SNAPSHOT.jar ./ClientApp.jar ENTRYPOINT ["java", "-jar", "ClientApp.jar"]
4. 验证Jar包内容(排查用)
若修改后仍报错,可先验证Jar包内是否包含目标文件:
# 本地执行,检查Jar包内是否有目标json jar tf target/ClientApp-0.0.1-SNAPSHOT.jar | grep anaplan-connector
若输出中能看到该文件,说明打包正常,问题仍在代码读取逻辑;若看不到,需调整构建工具配置。
内容的提问来源于stack exchange,提问作者Error404
相关产品推荐
相关产品推荐

