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

     

  • 相关阅读:
    MySQL 初识别语句,数据库、表、行的增删改查
    mysql如何从全备文件中恢复单个库或者单个表
    Shell 同步时间脚本
    app手机端连接tomcat电脑端服务器
    大于号转义符&gt;---小于号转义符&lt;
    轻松实现页面提交中
    重复提交问题(一)
    json
    ExtJs 6.0+快速入门,ext-bootstrap.js文件的分析,各版本API下载(一)
    ExtJS 6 如何引入Dashboard模版
  • 原文地址:https://www.cnblogs.com/jwentest/p/10043385.html
Copyright © 2011-2022 走看看