40

生产实战:如何正确地读取jar包中的File

 4 years ago
source link: https://www.tuicool.com/articles/Ebau6ff
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击蓝色“ 乔志勇笔记 ”关注我哟

获取最新 面试&学习 福利资源  

A3Qfuqe.jpg!web

关注我,回复口令获取 最新 面试&学习 福利资源

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 ● publicInputStream getResourceAsStream(String name) {

学习工作中,要不断地发现、思考、总结,减少未知的未知。。。

如果你喜欢本文

请长按二维码,关注 乔志勇笔记

rAVriuU.jpg!web

转发 朋友圈 ,是对我最大的支持哟

如果你喜欢这篇文章,在看,转发吧。

相信明天更加美好 (*^__^*) 


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK