点击蓝色“ 乔志勇笔记 ”关注我哟
获取最新 面试&学习 福利资源
关注我,回复口令获取 最新 面试&学习 福利资源 :
- 001 : 中华石杉老师的 分布式面试突击 视频教程
- 002 : 最清晰整体的 微服务全面解读 的PDF
- 003 : 亿级电商架构 的视频实战课程
一、文章背景:
项目中采用FreeMarker模板生成PDF文件,在本地idea中轻松加载到了target/class下的 contract.ftl 的模板,测试环境却无法正确加载对应的FreeMarker模板。
二、分析过程
猜测原因如下:
1、jar包中未包含相应的文件:
unzip jar包, tree 查看目录,在 /BOOT-INF/classes/contract.ftl ,排除
2、加载的路径地址不正确
代码中的new File("path") 基于classpath的相对路径加载时抛FileNotFoundException,明明路径是正确的,当时很迷惑
3、路径选择不正确
难道jar包中得用绝对路径 吗?
换成绝对路径后,路径成为file:/data/app/pandaloan/pandaloan.jar!/BOOT-INF/classes!/contract.ft
这样jar包中独有的资源url更不可能拿到文件目录了
4、加载方式不对
当问题解决不了时,跳出原有思维,再往外跳一步,也许会看到一线生机
由于原有代码是同事从网上粘贴过来的,看来得往更根本处去分析了。
能不能换一种模板的加载放肆,而不再纠结于原有的基于文件系统加载模板资源
找到了基于类路径加载的方式,成功尝试解决了问题 ,代码如下
三、 深入思考
问题解决了,不能就放下了,至少也要找到发生的根本
1、为什么不能通过 new File() 的方式正确加载资源哪?
找到了一篇分析文章:https://www.cnblogs.com/cn-coder/p/7089688.html
归纳总结一下:
jar包是一个单独的文件而非文件夹,并且jar中资源有专门的url形式,是不可能通过文件系统定位到文件资源的
2、如何正确地加载jar包中的资源
用例:
// Class 加载jar包资源
//ClassPathResource 加载jar包资源
本质:
查看上述代码源码,都是使用了ClassLoader ,在运行时动态地获取加载类的运行信息
ClassLoader 最重要两个命令
1 ● public InputStream getResourceAsStream(String name) {
学习工作中,要不断地发现、思考、总结,减少未知的未知。。。
如果你喜欢本文
请长按二维码,关注 乔志勇笔记
转发 朋友圈 ,是对我最大的支持哟
如果你喜欢这篇文章,在看,转发吧。
相信明天更加美好 (*^__^*)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring Boot 2 实战:常用读取配置的方式
- Python代码审计实战案例总结之CRLF和任意文件读取
- Tensorflow数据读取指南
- Python如何读取文件
- Java实时读取日志文件
- 如何读取一个.ini文件?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。