- 在idea中读取resources下的文件没有问题(调用getFile),但是打成jar包就会出问题;
- 使用spring的ClassPathResource或者hutool的ClassPathResource去解析文件都会有问题;
- 但是使用上面两个工具去读取inputstream或者byte就没问题,因为内部都是调用ClassLoader的getResource方法,如果是文件,那么就是file://xxx,如果是jar包那么就会是jar:file://xxx;
- 因为如果是读取文件,那么路径就是file://xxx,但是在jar包中就不存在这东西,只会存在jar:file://xxx。读取inputstream或者byte最终会被解析成url方式读取(调用url的openStream方法),url方式读取就可以读取到file://xxx或者jar:file://xxx,读取文件就不行
- 所以遇到这种问题的时候不要试图去读取文件,而是要读取inputstream或者bytes
- 有3种方式可以实现:1. 手动去使用ClassLoader获取,2. 使用spring的ClassPathResource,3. 使用hutool的ClassPathResource
- 推荐:hutool的ClassPathResource,因为代码量少,并且不用捕获异常,hutool封装了ResourceUtil,使用getResourceObj或者readBytes方法都可以
- 注意:文件名前不需要加
classpath:
,也不用加/
这种绝对路径:- 错误示范:
Resource resource = ResourceUtil.getResourceObj("classpath:/config/a.xlsx");
- 正确示范:
Resource resource = ResourceUtil.getResourceObj("config/a.xlsx");
- 错误示范: