SpringBoot打包jar后读取文件的坑使用ClassPathResource获取失败

发布时间:2022-05-23 00:38 阅读次数:
本文摘要:博主在读取邮件模板的时候,当地测试使用ClassPathResource都可以正常读取,但打包成jar包传到服务器上就无法获取了,报错信息是:class path resource [xxxx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxxx.jar!/BOOT-INF/classes!xxxx,话不多说,先看正确的获取

亚博手机版app下载

亚博手机版app下载

博主在读取邮件模板的时候,当地测试使用ClassPathResource都可以正常读取,但打包成jar包传到服务器上就无法获取了,报错信息是:class path resource [xxxx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxxx.jar!/BOOT-INF/classes!xxxx,话不多说,先看正确的获取方法:使用PathMatchingResourcePatternResolver。String txt = "";ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources("templates/layout/email.html");Resource resource = resources[0];//获得文件流,因为在jar文件中,不能直接通过文件资源路径拿到文件,可是可以在jar包中拿到文件流InputStream stream = resource.getInputStream();StringBuilder buffer = new StringBuilder();byte[] bytes = new byte[1024];try { for (int n; (n = stream.read(bytes)) != -1; ) { buffer.append(new String(bytes, 0, n)); }} catch (IOException e) { e.printStackTrace();}txt = buffer.toString();然后,想知道更多的咱们就继续看看是怎么回事,如果只是为相识决问题,那就可以忽略下面的内容了。

为了老汉好奇的心,我们继续探索下去,到底是怎么回事?我们先看看之前的代码:String txt = "";Resource resource = new ClassPathResource("templates/layout/email.html");txt = fileUtil.readfile(resource.getFile().getPath());其实这是一个jar包公布的大坑,相信许多小同伴遇到了读取文件的问题,其实使用getFile()的时候的坑,为了弄明确到底是咋回事,我举行了跟踪,效果返回的是一个Jar协议地址:jar:file:/xxx/xx.jar!/xxxx:返回的是一个Jar协议地址:jar:file:/xxx/xx.jar!/xxxx然后继续跟踪到org.springframework.util.ResourceUtils#getFile(java.net.URL, java.lang.String)中,有如下的判断:public static File getFile(URL resourceUrl, String description) throws FileNotFoundException { Assert.notNull(resourceUrl, "Resource URL must not be null"); if (!"file".equals(resourceUrl.getProtocol())) { throw new FileNotFoundException(description + " cannot be resolved to absolute file path because it does not reside in the file system: " + resourceUrl); } else { try { return new File(toURI(resourceUrl).getSchemeSpecificPart()); } catch (URISyntaxException var3) { return new File(resourceUrl.getFile()); } }}org.springframework.util.ResourceUtils#getFile(java.net.URL, java.lang.String)因为resourceUrl.getProtocol()不是file,而是 jar,这样就抛出了一个FileNotFoundException异常。ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它基础不会去实验加载Jar中的文件,要想加载Jar中的文件,只要用可以读取jar中文件的方式加载即可,好比 xx.class.getClassLoader().getResouceAsStream()这种以流的形式读取文件的方式,所以使用读取文件流就可以拿到了。


本文关键词:SpringBoot,打包,jar,后,读取,文件,亚博手机版app下载,的,坑,使用

本文来源:亚博手机版app下载-www.scvertex.com

在线客服 联系方式 二维码

电话

084-337974236

扫一扫,关注我们