SpringBoot项目打包成jar后读取文件的大坑,使用ClassPathResource获取classpath下文件失败
在项目中使用ClassPathResource中获取资源文件,在本地环境可以正常访问获取到文件,然后打包部署到测试环境后却报错不能找到给资源文件,报错信息如下:
解决方法:使用PathMatchingResourcePatternResolver获取资源文件,不使用classPathResource
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
org.springframework.core.io.Resource[] resources = resolver.getResources("/static/signature.png");
InputStream inputStream = resources[0].getInputStream();
//file文件转换成MultipartFile文件
MultipartFile multipartFile = new MockMultipartFile("file", "signature.png", "text/plain", IOUtils.toByteArray(inputStream));
原因:
因为resourceUrl.getProtocol()不是file,而是 jar,这样就抛出了一个FileNotFoundException异常。
ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它根本不会去尝试加载Jar中的文件,要想加载Jar中的文件,只要用可以读取jar中文件的方式加载即可,比如 xx.class.getClassLoader().getResouceAsStream()这种以流的形式读取文件的方式,所以使用读取文件流就可以拿到了。