Windows本地正常Unix报错:NoSuchFileException(首斜杠丢失)
问题原因与解决方法
你的问题出在file协议URL的跨平台格式差异上:
- Windows系统对
file:/格式兼容性更强,会自动补全缺失的斜杠,所以本地运行正常。 - Unix系统严格遵循URL标准,
file:/opt/...会被解析为相对路径(缺少代表本地主机的空字段),导致首斜杠被移除,变成opt/racer-batch-app/...这样的相对路径,自然找不到文件。
解决办法
1. 使用标准的Unix file协议格式
把路径改成file:///opt/racer-batch-app/*.csv(三个斜杠):
activationResources = patternResolver.getResources("file:///opt/racer-batch-app/*.csv");
这是file协议的标准写法:file://<主机地址>/<路径>,本地路径的主机地址为空,所以用///衔接。
2. 改用跨平台的路径构建方式
如果需要兼容Windows和Unix,建议用Spring的FileSystemResource或者Java NIO的Paths类构建路径,避免硬编码URL格式:
// FileSystemResource示例 FileSystemResource resource = new FileSystemResource("/opt/racer-batch-app/"); Resource[] activationResources = patternResolver.getResources(resource.getPath() + "*.csv");
或者直接用NIO路径API:
Path dirPath = Paths.get("/opt/racer-batch-app"); Resource[] activationResources = patternResolver.getResources(dirPath.toUri().toString() + "*.csv");
3. 配置文件抽离路径
更优雅的方式是把文件路径放到配置文件(比如application.properties)中,不同环境配置不同路径,代码直接读取配置:
# Unix环境配置 file.path=/opt/racer-batch-app/*.csv
@Value("${file.path}") private String filePath; // 代码中使用 activationResources = patternResolver.getResources("file:///" + filePath);
内容的提问来源于stack exchange,提问作者angus
相关产品推荐
相关产品推荐

