Spring Boot控制器中如何访问resources文件夹内文件?
解决Spring Boot中访问resources文件并用于ProcessBuilder的问题
场景说明
你需要把本地绝对路径替换为resources目录下的YamlToJson.js路径,但要注意:Spring Boot打包成jar后,resources里的文件是嵌入在jar包内部的,ProcessBuilder无法直接访问jar内的文件——它需要的是本地文件系统的真实路径。所以要分开发环境和生产打包环境两种情况处理。
1. 开发环境(IDE中运行)
在IDE里运行时,resources文件会被编译到target/classes目录下,可以直接通过ClassPathResource获取真实路径:
import org.springframework.core.io.ClassPathResource; import java.io.File; // 在Controller方法中 ClassPathResource resource = new ClassPathResource("YamlToJson.js"); File jsFile = resource.getFile(); // 仅在开发环境/未打包时有效 String nodeFilePath = jsFile.getAbsolutePath(); // 初始化ProcessBuilder ProcessBuilder pb = new ProcessBuilder("node", nodeFilePath);
注意:这个方法仅适用于IDE运行或未打包成jar的场景,打包后
getFile()会抛出FileNotFoundException——此时文件在jar内部,不是独立的文件系统路径。
2. 生产环境(打包成jar后运行)
打包后需要先把jar内的资源文件复制到本地临时目录,再用临时文件的路径给ProcessBuilder:
import org.springframework.core.io.ClassPathResource; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; // 在Controller方法中 ClassPathResource resource = new ClassPathResource("YamlToJson.js"); // 创建临时文件 Path tempPath = Files.createTempFile("YamlToJson", ".js"); // 将jar内的文件复制到临时文件 Files.copy(resource.getInputStream(), tempPath, StandardCopyOption.REPLACE_EXISTING); File tempFile = tempPath.toFile(); // 设置临时文件在JVM退出时自动删除 tempFile.deleteOnExit(); // 使用临时文件路径初始化ProcessBuilder String nodeFilePath = tempFile.getAbsolutePath(); ProcessBuilder pb = new ProcessBuilder("node", nodeFilePath);
这个方法在开发和生产环境都能正常工作,因为临时文件是本地文件系统中的真实文件,ProcessBuilder可以直接访问。
3. 额外注意事项
- 确保
YamlToJson.js放在src/main/resources根目录下,如果在子目录(比如src/main/resources/js),则路径要写成"js/YamlToJson.js"。 - 如果你的Spring Boot应用是war包部署,
getResource().getFile()在部分容器中可能可以直接访问,但仍推荐用临时文件的方式保证兼容性。 - 临时文件会占用磁盘空间,
deleteOnExit()会在JVM正常退出时删除,但如果应用意外终止,可能会残留临时文件,必要时可以添加定期清理逻辑。
内容的提问来源于stack exchange,提问作者Aniket Thorat
相关产品推荐
相关产品推荐

