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

     

  • 相关阅读:
    完美解决Python与anaconda之间的冲突问题
    ansible之roles
    ansible剧本之playbook操作
    git从远程仓库拉取内容或向远程仓库上传内容
    python操作excel
    nginx基于uwsgi部署Django
    第二篇:版本控制git之分支
    笔试题92-101
    Django总结
    笔试题70-91
  • 原文地址:https://www.cnblogs.com/jwentest/p/10043385.html
Copyright © 2011-2022 走看看