读取jar文件内容

2023-10-27

一、SpringBoot项目打包成jar后读取文件的大坑,使用ClassPathResource获取classpath下文件失败

java.io.FileNotFoundException: class path resource [WorldPayTemplate.txt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/opt/app.jar!/BOOT-INF/classes!/WorldPayTemplate.txt

读取文件模本使用的是

        ClassPathResource resource = new ClassPathResource("WorldPayTemplate.txt");
        log.info("读取文件对象,{}",resource);
        StringBuilder builder = new StringBuilder();
        try {
            File file = resource.getFile();
            log.info("file对象,{}",file);
            BufferedReader reader = new BufferedReader(new FileReader(file));
            log.info("BufferedReader对象,{}",reader);
            String line = null;
            while ((line = reader.readLine()) != null) {
                log.info("单行文件内容:{}",line);
                builder.append(line);
            }
            log.info("文件内容:{}",builder);
        } catch (IOException e) {
            log.error("文件读取异常:{}",e);
            throw new MallException(ErrorMessage.FILE_READ_ERROR.getErrorCode());
        }

抛到测试环境出现文件找不到错误,本地测试没问题

二、解决方法

使用ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

String txt = "";
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("templates/layout/email.html");
Resource resource = resources[0];
//获得文件流,因为在jar文件中,不能直接通过文件资源路径拿到文件,但是可以在jar包中拿到文件流
InputStream stream = resource.getInputStream();
StringBuilder buffer = new StringBuilder();
byte[] bytes = new byte[1024];
try {
    for (int n; (n = stream.read(bytes)) != -1; ) {
        buffer.append(new String(bytes, 0, n));
    }
} catch (IOException e) {
    e.printStackTrace();
}
txt = buffer.toString();

三、出现这个问题的原因

其实这是一个jar包发布的大坑,使用getFile()的时候的坑,对 ClassPathResource resource = new ClassPathResource("WorldPayTemplate.txt");以及File file = resource.getFile();进行debug,结果返回的是一个Jar协议地址:jar:file:/xxx/xx.jar!/xxxx。

 然后继续跟踪到getFile(java.net.URL, java.lang.String)中,有如下的判断:

public static File getFile(URL resourceUrl, String description) throws FileNotFoundException {
    Assert.notNull(resourceUrl, "Resource URL must not be null");
    if (!"file".equals(resourceUrl.getProtocol())) {
        throw new FileNotFoundException(description + " cannot be resolved to absolute file path because it does not reside in the file system: " + resourceUrl);
    } else {
        try {
            return new File(toURI(resourceUrl).getSchemeSpecificPart());
        } catch (URISyntaxException var3) {
            return new File(resourceUrl.getFile());
        }
    }
}

 

因为resourceUrl.getProtocol()不是file,而是 jar,这样就抛出了一个FileNotFoundException异常。

ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它根本不会去尝试加载Jar中的文件,要想加载Jar中的文件,只要用可以读取jar中文件的方式加载即可,比如 xx.class.getClassLoader().getResouceAsStream()这种以流的形式读取文件的方式,所以使用读取文件流就可以拿到了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取jar文件内容 的相关文章

  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • React 4 种状态类型及 N 种状态管理

    React 是一个视图层框架 其核心思想是 UI f state 即 UI 是 state 的投影 state 自上而下流动 整个 React 组件树由 state 驱动 当一个 React 应用程序足够复杂 组件嵌套足够深时 组件树中的状
  • VUE前后分离调起微信支付

    第一步 VUE 需要安装 微信支付模块 npm install weixin js sdk 加入需要引入的模块 import wx from weixin js sdk 第二步 封装 微信支付方法 wexinPay data cb erro
  • ssh实现ubuntu免密登录

    生成公钥和私钥 ssh keygen 按三下ENTER 公私钥默认保存在 ssh 文件夹中 cd ssh 发送公钥给另一台电脑 ssh copy id 用户名 ip 然后通过ssh链接就不需要输入密码了
  • .PLY文件格式剖析(二)

    在很多书上介绍的三维图形数据都是 obj 3ds格式 dxf等格式的 真正讲解如何读取的就只有 obj格式文件的 但是我现在所做的内容 要求从 ply文件中读取初始塞维图形数据 这我就不会了 虽然对 ply文件格式有了了解 Ply文件格式是
  • Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度

    我们在做Android平台GB28181的时候 其中实时位置 MobilePosition 订阅和上报这块 涉及到实时经纬度的获取 特别是执法记录 车载系统的那个等场景 几乎就是标配 今天主要是分享一段实时获取位置的代码 CameraPub
  • 详解Ubuntu配置VSCode+CMake的C++开发环境

    搬运自详解Ubuntu18 04配置VSCode CMake的C 开发环境 Python技术站 原文写18 04 亲测20 04也能用 学slam十四讲的宝宝可以用这个方法去跑一下里面的代码 本文将会介绍如何在Ubuntu 配置VSCode
  • (一)Python数据类型

    1 字符串 使用单引号 使用双引号 使用三引号 2 布尔类型 bool False bool True 3 整数 int 20 4 浮点数 float 2 3 5 数字 int x base 将x转换为一个整数 float x 将x转换到一
  • C++递推经典案例No.3——爬楼梯的最小代价

    数组的每个下标作为一个阶梯 第 i 个阶梯对应着一个非负数的体力花费值 cost i 下标从 0 开始 每当爬上一个阶梯都要花费对应的体力值 一旦支付了相应的体力值 就可以选择向上爬一个阶梯或者爬两个阶梯 请找出达到楼层顶部的最低花费 在开
  • 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见 https blog csdn net mrcrack article details 86501716 信息学奥赛一本通 C 版 刷题 记录 http ybt ssoier cn 8088 http blog csdn net
  • C++:主要的关联容器类型:map

    目录 1 关联式容器 2 键值对 3 树形结构的关联式容器 4 map的特点 5 使用map 常用接口的使用 1 find 2 insert 3 erase 4 operator 6 multimap 1 关联式容器 与vector lis
  • KEIL - 下载调试出现“TRACE HW not present”

    使用st link调试遇到烧写完成之后不能进入调试状态 提示TRACE HW not present 点击确认 提示错误 Erron target DLL has been cancelled Debugger aborted 解决办法 第
  • 基于springboot开发项目架构之FastDFS

    fastDSF介绍 FastDFS是用c语言编写的一款开源的分布式文件系统 它是由淘宝资深架构师余庆编写并开源 FastDFS专为互联网量身定制 充分考虑了冗余备份 负载均衡 线性扩容等机制 并注重高可用 高性能等指标 使用FastDFS很
  • Centos 7 归档和压缩文件

    1 tar命令进行文件的归档和压缩 1 1归档和压缩 归档和压缩文件的好处 节约硬盘的资源 加快文件传输速率 tar命令的作用就是打包 压缩文件 用法 tar 选项 压缩成文件的名称 源文件名称 例如 tar czvf passwd tar
  • 处理点云数据(六):点云分割

    展示了如何在三维激光雷达数据中检测地平面和发现附近的障碍物 clear clc for img idx 181 446 fid fopen sprintf D KITTI data set 2011 09 26 2011 09 26 dri
  • doris 常用操作收集

    1 bit map索引 原理 用户可以在建表时指定在某些列上创建Bitmap索引 也可以在运行时通过 ALTER TABLE TODO 命令新增Bitmap索引 Bitmap索引是一中特殊的数据库索引技术 其索引使用bit数组 或称bitm
  • 在服务器上部署asp网站,部署asp网站到云服务器

    部署asp网站到云服务器 内容精选 换一换 通常情况下 需要结合客户的实际业务环境和具体需求进行业务改造评估 建议您进行服务咨询 这里仅描述一些通用的策略供您参考 主要分如下几方面进行考虑 业务迁移不管您的业务是否已经上线华为云 业务迁移的
  • Python 正则表达式验证IPv4地址

    1 Simple regex to check for an IP address 0 9 1 3 3 0 9 1 3 2 Accurate regex to check for an IP address allowing leading
  • SecureCRT 从安装到当成串口简单使用的教程:

    目录 1 安装 SecureCRT 9 2安装与激活教程 哔哩哔哩 bilibili 看这个视频教程 里面置顶的评论里有安装包 2 配置串口 选择这个 Port会自动的识别出来你的端口 如果没有 就查驱动 然后这里什么都不要选 3 配置显示
  • publish.vue?02fe:77 Uncaught (in promise) TypeError: _api_edu_course__WEBPACK_IMPORTED_MODULE_0__.de

    前端Vue点击事件后没反应 数据库数据未更新 后端未报错 然后发现控制台报错如下 Uncaught in promise TypeError api edu course WEBPACK IMPORTED MODULE 0 default
  • 读取jar文件内容

    一 SpringBoot项目打包成jar后读取文件的大坑 使用ClassPathResource获取classpath下文件失败 java io FileNotFoundException class path resource World