为何Spring Boot中使用类路径加载器及‘classpath:’前缀加载文件失败?
检查文件路径正确性
类路径加载时,路径别以/开头。比如文件放在resources/config/test.txt,加载路径就写config/test.txt;另外注意大小写,Windows下IntelliJ不区分,但Linux环境会严格校验,别因为大小写匹配不上导致加载失败。
推荐用Spring自带的ClassPathResource工具类,比手动调用类加载器更靠谱:ClassPathResource resource = new ClassPathResource("config/test.txt"); // 本地运行时可以用getFile(),但打包成jar后必须改用getInputStream() File file = resource.getFile();确认IntelliJ的资源文件夹配置
打开Project Structure(快捷键Ctrl+Alt+Shift+S),进入Modules选中你的项目模块,切换到Paths标签,确保resources文件夹被标记为Resources Root;另外去Build, Execution, Deployment->Compiler->Resource Patterns里看看,你的文件后缀(比如.txt、.json)是否在默认的资源匹配列表里,自定义后缀要手动加进去。清理缓存并重新构建
有时候IntelliJ的缓存会搞事情,导致资源文件没被正确复制到target目录。先执行Build->Clean Project,再选Build->Rebuild Project,也可以手动删掉target文件夹后重新构建。打包jar后的读取注意事项
如果后续要打包成jar运行,资源文件是在jar包内部的,这时候不能用getFile()获取文件对象,必须用输入流读取:try (InputStream is = new ClassPathResource("test.txt").getInputStream()) { // 在这里处理输入流内容 } catch (IOException e) { e.printStackTrace(); }排查Maven/Gradle的资源过滤配置
要是用Maven,打开pom.xml检查build下的resources节点:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <!-- 设为true时要确保不会过滤掉你的文件 --> <includes> <include>**/*</include> <!-- 确保包含所有资源文件 --> </includes> </resource> </resources> </build>Gradle项目则检查
build.gradle里的sourceSets配置,保证resources目录被正确识别。
内容的提问来源于stack exchange,提问作者Thomas Bratt

