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()這種以流的形式讀取文件的方式,所以使用讀取文件流就可以拿到了。