返回顶部
首页 > 资讯 > 精选 >项目打包成jar后包无法读取src/main/resources下文件怎么解决
  • 874
分享到

项目打包成jar后包无法读取src/main/resources下文件怎么解决

2023-06-29 20:06:15 874人浏览 独家记忆
摘要

这篇文章主要介绍“项目打包成jar后包无法读取src/main/resources下文件怎么解决”,在日常操作中,相信很多人在项目打包成jar后包无法读取src/main/resources下文件怎么解决问题上存在疑惑,小编查阅了各式资料,

这篇文章主要介绍“项目打包成jar后包无法读取src/main/resources下文件怎么解决”,在日常操作中,相信很多人在项目打包成jar后包无法读取src/main/resources下文件怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”项目打包成jar后包无法读取src/main/resources下文件怎么解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、项目场景

    在项目中读取文件时, 使用new File() 出现的一个坑以及解决流程
    这种问题不仅在本地文件读取时会遇到, 而且在下载项目下 (例如: src/main/resources目录下) 的文本时, 也会遇到,

    二、问题描述

    发现问题

    原来代码
    该代码功能是利用 common.io 包下的FileUtils来读取文件, 放到一个字符串

    String s = FileUtils.readFileToString(new File("src/main/resources/holiday.txt"), "utf-8");

    这种路径书写方式 new File("src/main/resources/holiday.txt") , 在本地运行没问题,
    但是打包之后在服务器中运行出现了问题. 下面是错误截图

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    可以看到在服务器日志提示: java.io.FileNotFoundException: File 'holiday.txt' does not exist
    即: 在打包后, 一开始配置的路径src/main/resources下无法找到该文件

    分析问题

    项目在打包之后, 位于 resource目录下的文件, 最常见的就是各种spring配置文件就会打包在 BOOT-INF/classes 目录下
    而FIle 在按照原来的文件路径src/main/resources/holiday.txt'去寻找, 必然找不到文件, 因此会报文件找不到的异常

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    在定位问题的过程中发现, 这里 提供了一个思路
    就是SpringBoot中所有文件都在jar包中,没有一个实际的路径,因此可以使用以下方式

            public void function6(String fileName) throws IOException {        ClassPathResource classPathResource = new ClassPathResource(fileName);        InputStream inputStream = classPathResource.getInputStream();        getFileContent(inputStream);    }

    为什么使用 ClassPathResource 后, 可以找到打包后的文件路径?

    上面代码的核心就是: 实例化ClassPathResource 对象. 然后调用getInputStream 来获取资源文件

    下面我们来分析这些代码
    ClassPathResource 在实例化时, 会初始化类加载器 classLoader 并将项目所用到的所有路径加载到类加载器 classLoader 中, 这些路径包括: java运行环境的jar, Maven 项目中的jar, 以及当前项目打包后的jar等(如下图)

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    classPathResource.getInputStream 在获取资源文件时, 因为上面我们初始化了一个classLoader.
    所以classLoader不为空, 因此会执行 getResourceAsStream 方法, 我们来追一下这个方法

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    getResourceAsStream 方法中的getResource是实际的业务处理方法, 我们继续深入

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    getResource 方法如下图, 实际的功能就是递归调用自己, 去不断遍历 parent 下的路径, 获取对应的资源文件
    那么 parent 又是谁呢? 我们继续往下看

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    看到这里我们豁然开朗, 这个神秘的 parent 就是类加载器classLoader!!!
    因此getResource 方法就是去不断遍历我们在ClassPathResource实例化时, 创建的类加载器下面的路径!!!(对应第1点)

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    三、解决方案

    原来读取文件的代码如下

    String s = FileUtils.readFileToString(new File("src/main/resources/holiday.txt"), "utf-8");

    去查看 File 的构造函数, 看能否通过 InputStream 来构造
    从下图看是不行的

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    方案一

    并且我们发现 org.apache.commons.io没有提供ClassPathResource 作为入参的读取文件的方法.
    因此我们必须手写读取文件的方法

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    手写的代码如下
    主要注意 Resource resource = new ClassPathResource(fileName); is = resource.getInputStream();

            public static List<String> readTxtFile(String fileName) {        List<String> listContent = new ArrayList<>();        InputStream is = null;        InputStreamReader isr = null;        BufferedReader br = null;        String encoding = "utf-8";        try {            Resource resource = new ClassPathResource(fileName);            is = resource.getInputStream();            isr = new InputStreamReader(is, encoding);            br = new BufferedReader(isr);            String lineTxt = null;            while ((lineTxt = br.readLine()) != null) {                listContent.add(lineTxt);            }        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                br.close();                isr.close();                is.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return listContent;    }

    方案二

    这种方式对代码入侵较小, 核心还是利用 common.io 下的 FileUtils, 具体方法是
    利用FileUtils将ClassPathResource.getInputStream 得到的输入流复制到临时文件中, 然后读取这个临时文件
    这种方式缺点是: 需要创建临时文件, 如果待读取文件过大, 则重新创建文件和复制操作会消耗一定的空间和时间, 影响性能

      //方式二 利用FileUtils将ClassPathResource.getInputStream 得到的输入流复制到临时文件中  Resource resource = new ClassPathResource("holiday.txt");  InputStream inputStream = resource.getInputStream();  File tempFile = File.createTempFile("temp", ".txt");  FileUtils.copyInputStreamToFile(inputStream, tempFile);    String s = FileUtils.readFileToString(tempFile, StandardCharsets.UTF_8);

    意外出现

    到这里又出现了一个问题, 就是我用的测试项目因为在 Maven 里面指定了某些格式的文件. 如下配置
    因为指定了banner.txt 以及 xml 与 properties结尾的文件作为资源被打包. 所以文件 holiday.txt 运行后还是访问不到
    有问题的pom.xml文件如下

    <!-- 资源拷贝插件,实现在打包时自动拷贝java目录下以及resources目录下的xml的配置文件 --><resources><resource><directory>src/main/java</directory><includes><include>***.xml</include><include>**banner.txt</include></includes></resource></resources>

    打包后资源文件截图如下, 从该图中可以看到 holiday.txt 没有被打包进来

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    程序运行之后的错误截图

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    我们修改下指定打包的配置 <include>***.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>***.properties</include><include>**/*.txt</include></includes></resource></resources>

    修改pom文件后, 重新打包后资源文件(从这里可以看到 holiday.txt 被打包进来 )

    项目打包成jar后包无法读取src/main/resources下文件怎么解决

    到此,关于“项目打包成jar后包无法读取src/main/resources下文件怎么解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: 项目打包成jar后包无法读取src/main/resources下文件怎么解决

    本文链接: https://lsjlt.com/news/326272.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 项目打包成jar后包无法读取src/main/resources下文件怎么解决
      这篇文章主要介绍“项目打包成jar后包无法读取src/main/resources下文件怎么解决”,在日常操作中,相信很多人在项目打包成jar后包无法读取src/main/resources下文件怎么解决问题上存在疑惑,小编查阅了各式资料,...
      99+
      2023-06-29
    • 项目打包成jar后包无法读取src/main/resources下文件的解决
      目录一、项目场景二、问题描述发现问题分析问题为什么使用 ClassPathResource 后, 可以找到打包后的文件路径三、解决方案方案一方案二意外出现总结一、项目场景 在项目中读...
      99+
      2024-04-02
    • Maven项目中读取src/main/resources目录下的配置文件的方法
      在Maven项目的开发中,当需要读取src/下的配置文件时,该怎么做?我们假设Resources下有一个文件名为kafka.properties的配置文件(为什么用kafka.properties,因为这是在做kafka项目的时候碰到的问题...
      99+
      2023-05-30
      maven 目录 sr
    • 解决@springboottest注解无法加载src/main/resources目录下文件
      目录结论环境及问题描述问题分析1.首先com.xx.xxx.service.SsoService该类存在2.再看下pom文件的配置3.这个类是在src/main/resources目...
      99+
      2024-04-02
    • 解决java项目jar打包后读取文件失败的问题
      java项目jar打包后读取文件失败 在本地项目读取文件时 this.getClass().getClassLoader().getResource("").getPath()+...
      99+
      2024-04-02
    • springboot读取文件,打成jar包后访问不到的解决
      springboot读取文件,打成jar包后访问不到 最新开发出现一种情况,springboot打成jar包后读取不到文件,原因是打包之后,文件的虚拟路径是无效的,只能通过流去读取。...
      99+
      2024-04-02
    • springboot读取文件,打成jar包后访问不到怎么办
      这篇文章主要介绍了springboot读取文件,打成jar包后访问不到怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。springboot读取文件,打成jar包后访问不到...
      99+
      2023-06-20
    • springboot打成jar后无法读取根路径和文件的解决
      目录springboot打成jar后无法读取根路径和文件springboot打jar找不到资源文件springboot打成jar后无法读取根路径和文件 ClassLoader.g...
      99+
      2024-04-02
    • pyinstaller打包后,配置文件无法正常读取的解决
      目录pyinstaller打包配置文件无法正常读取pyinstaller又踩一坑,configparser os.mknod完整代码pyinstaller打包配置文件无法正常读取 i...
      99+
      2024-04-02
    • 怎么解决vue项目打包后文件过大问题
      这篇文章主要讲解了“怎么解决vue项目打包后文件过大问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决vue项目打包后文件过大问题”吧!为什么打包后文件过大?移动app项目,使用vu...
      99+
      2023-06-30
    • ​c++无法打开包括文件complex.h怎么解决
      问题可能是由于编译器无法找到complex.h头文件所在的路径。为了解决这个问题,你可以尝试以下几种方法: 检查头文件路径:确保...
      99+
      2024-02-29
      ​c++
    • vue-cli 项目打包完成后运行文件路径报错怎么办
      小编给大家分享一下vue-cli 项目打包完成后运行文件路径报错怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题:刚新建...
      99+
      2024-04-02
    • windows文件或目录损坏且无法读取怎么解决
      这篇文章主要介绍“windows文件或目录损坏且无法读取怎么解决”,在日常操作中,相信很多人在windows文件或目录损坏且无法读取怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”windows文件或目...
      99+
      2023-07-02
    • vue项目打包之后生成一个可修改IP地址文件怎么实现
      这篇“vue项目打包之后生成一个可修改IP地址文件怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue项目打包之后生...
      99+
      2023-07-05
    • windows 0x80070570文件或目录损坏且无法读取怎么解决
      这篇文章主要介绍“windows 0x80070570文件或目录损坏且无法读取怎么解决”,在日常操作中,相信很多人在windows 0x80070570文件或目录损坏且无法读取怎么解决问题上存在疑惑,小编查阅了各式资料,...
      99+
      2023-07-01
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作