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

jujusharp  •  Jul 3, 2019 7:54:37 PM

原文地址


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

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

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

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

001 :中华石杉老师的分布式面试突击视频教程

002 :最清晰整体的微服务全面解读的PDF

- 003:亿级电商架构的视频实战课程

一、文章背景:

项目中采用FreeMarker模板生成PDF文件,在本地idea中轻松加载到了target/class下的 contract.ftl 的模板,测试环境却无法正确加载对应的FreeMarker模板。

二、分析过程

猜测原因如下:

1、jar包中未包含相应的文件:

unzip jar包, tree 查看目录,在 /BOOT-INF/classes/contract.ftl ,排除

2、加载的路径地址不正确

  1. configuration.setDirectoryForTemplateLoading(new File("path"))

  1. configuration.getTemplate("framemaker.ftl");

代码中的new File("path") 基于classpath的相对路径加载时抛FileNotFoundException,明明路径是正确的,当时很迷惑

3、路径选择不正确

难道jar包中得用绝对路径 吗?

换成绝对路径后,路径成为file:/data/app/pandaloan/pandaloan.jar!/BOOT-INF/classes!/contract.ft

这样jar包中独有的资源url更不可能拿到文件目录了

4、加载方式不对

当问题解决不了时,跳出原有思维,再往外跳一步,也许会看到一线生机

由于原有代码是同事从网上粘贴过来的,看来得往更根本处去分析了。

能不能换一种模板的加载放肆,而不再纠结于原有的基于文件系统加载模板资源

找到了基于类路径加载的方式,成功尝试解决了问题 ,代码如下

  1. //基于类路径,HttpWeb包下的framemaker.ftl文件

  2. configuration.setClassForTemplateLoading(this.getClass(), "/HttpWeb");

  3. configuration.getTemplate("framemaker.ftl");

三、 深入思考

问题解决了,不能就放下了,至少也要找到发生的根本

1、为什么不能通过 new File() 的方式正确加载资源哪?

找到了一篇分析文章:https://www.cnblogs.com/cn-coder/p/7089688.html    

归纳总结一下:

jar包是一个单独的文件而非文件夹,并且jar中资源有专门的url形式,是不可能通过文件系统定位到文件资源的

2、如何正确地加载jar包中的资源

// Class 加载jar包资源

  1. InputStream inputStream =this.getClass().getResourceAsStream(String path) ;

    //ClassTemplateLoader加载jar包资源

  2. configuration.setClassForTemplateLoading(this.getClass(), "/HttpWeb");

//ClassPathResource 加载jar包资源

  1. Resource resource = new ClassPathResource("bank_json.json");

查看上述代码源码,都是使用了ClassLoader ,在运行时动态地获取加载类的运行信息

ClassLoader 最重要两个命令


  1. public URL getResource(String name)

1 ● public InputStream getResourceAsStream(String name) {

  1. URL url = getResource(name);

  2. try {

  3. return url != null ? url.openStream() : null;

  4. } catch (IOException e) {

  5. return null;

  6. }

  7. }

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


如果你喜欢本文

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

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

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

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

0 回复
暂时没有回复,你也许会成为第一个哦