SpringBoot项目打包成jar后,使用ClassPathResource获取classpath下文件失败

SpringBoot项目打包成jar后读取文件的大坑,使用ClassPathResource获取classpath下文件失败

在项目中使用ClassPathResource中获取资源文件,在本地环境可以正常访问获取到文件,然后打包部署到测试环境后却报错不能找到给资源文件,报错信息如下:

image-20211227131153028

解决方法:使用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));

原因:

image-20211227131904968

因为resourceUrl.getProtocol()不是file,而是 jar,这样就抛出了一个FileNotFoundException异常。

ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它根本不会去尝试加载Jar中的文件,要想加载Jar中的文件,只要用可以读取jar中文件的方式加载即可,比如 xx.class.getClassLoader().getResouceAsStream()这种以流的形式读取文件的方式,所以使用读取文件流就可以拿到了。

参考文档:https://www.renfei.net/posts/1003293

posted @ 2021-12-27 13:21  肖恩雷  阅读(2129)  评论(0编辑  收藏  举报