zoukankan      html  css  js  c++  java
  • jar包获取资源文件

    背景

    写的一个spring boot项目打成jar包部署运行下,打成jar包,提示找不到资源文件,如下图:

     直接通过idea是可以运行的,但打成jar包后提示找不到资源文件,简单查阅后了解到是因为jar包在读取文件的方式不一致导致的

     

    问题分析

    先定位到哪行代码出错,如下:

    URI configurationFileURI = this.getClass().getClassLoader().getResource(CONFIGURATION_FILE).toURI();
    这里报错,提示getResource为null。

    原因如下:

    在jar文件中查找资源和在文件系统中查找资源的方式是不一样的

    错误的加载方式:

    XXX.calss.getResource(path)
    XXX.calss.getClassLoader().getResource(path)

    正确的加载方式:

    XXX.class.getResourceAsStream(path)
    XXX.calss.getClassLoader().getResourceAsStream(path)

    以流的方式来加载

     

    解决方法

    知道了根本原因了,就简单了,将之前getResource这种方式改成getResourceAsStream方法

    具体代码如下:

    InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(CONFIGURATION_FILE);
    BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream));
    ​
    String s = "";
    List<String> lines = new ArrayList<String>();
    ​
    while ((s = br.readLine()) != null) {
        lines.add(s);
    }
    ​
    // 关闭流
    resourceAsStream.close();
    br.close();

    简单总结

    1. 在jar文件中查找资源和在文件系统中查找资源的方式是不一样的

    2. jar包是一个单独的文件而非文件夹,绝对不可能通过"file:/e:/.../ResourceJar.jar/resource/res.txt"这种形式的文件URL来定位资源文件

    3. public InputStream getResourceAsStream(String name); 返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。

     

    参考资料

    http://hxraid.iteye.com/blog/483115

     

  • 相关阅读:
    内层城循环应用——买衣服
    内外层循环用法
    自定义函数的应用
    少有人走的路 随笔
    拆单发货逻辑
    拆单发货-分布页
    拆单发货-主页
    SP--report存储过程
    关于C#对Xml数据解析
    C#模拟http 发送post或get请求
  • 原文地址:https://www.cnblogs.com/jwentest/p/10043385.html
Copyright © 2011-2022 走看看