解决应用程序在JAR包中运行时无法读取类路径下文件的问题

问题情景

java应用程序在IDE运行正常,打成jar包后执行却发生异常:

java.io.FileNotFoundException: class path resource [cert/sync_signer_pri_test.key] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/home/apps/application.jar!/BOOT-INF/classes!/cert/sync_signer_pri_test.key
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:162)
at com.cfgdc.school.utils.JwtUtils.loadSyncSignerPrivateKey(JwtUtils.java:161)

上述错误信息指出文件路径是class path resource [cert/sync_signer_pri_test.key],但无法解析为绝对路径,因为它不在文件系统中,而是在一个jar包内。

这个文件在IDE中的位置是:src/main/resources/cert/sync_signer_pri_test.key,
打成jar包以后的位置是:/home/apps/application.jar!/BOOT-INF/classes!/cert/sync_signer_pri_test.key,并不是文件系统中的一个实际文件,而是一个可以通过类加载器读取的条目

原因分析

当应用程序打包成jar文件后,资源文件通常会被包含在jar内部。这时候,使用传统的File来访问资源文件可能会失败,因为jar中的资源并不是文件系统中的一个实际文件,而是一个可以通过类加载器读取的条目。

解决方案

要解决应用程序在JAR包中运行时无法读取类路径下文件的问题,需调整文件读取方式,使用流(InputStream)代替直接文件访问
使用这种方式,既可以在IDE直接运行,也可以打成jar包运行。

以下是具体步骤:

步骤一:修改文件读取方式

JwtUtils类的loadSyncSignerPrivateKey方法中,将使用Resource.getFile()的代码替换为通过InputStream读取:

import org.springframework.core.io.ClassPathResource;
import org.apache.commons.io.IOUtils;// 修改前的代码(导致异常)
// File file = new ClassPathResource("cert/sync_signer_pri_test.key").getFile();// 修改后的代码
try (InputStream inputStream = new ClassPathResource("cert/sync_signer_pri_test.key").getInputStream()) {String privateKeyContent = IOUtils.toString(inputStream, StandardCharsets.UTF_8);// 处理privateKeyContent,例如加载私钥
} catch (IOException e) {// 异常处理
}

步骤二:确保依赖项正确

如果使用Apache Commons IO的IOUtils,需在pom.xml中添加依赖:

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>

步骤三:重新打包并测试

重新构建应用并打包为JAR,运行测试以确认问题已解决。

替代方案:外部化配置文件

若希望将证书文件放在JAR外部:

  1. 将文件移至外部目录,如/home/config/cert/sync_signer_pri_test.key
  2. 修改配置读取路径,使用绝对路径或通过环境变量指定路径:
String externalConfigPath = System.getenv("CONFIG_PATH") + "/cert/sync_signer_pri_test.key";
File file = new File(externalConfigPath);
  1. 确保部署时正确设置环境变量或路径,并授予读取权限。

总结

优先采用流方式读取类路径资源,确保JAR内资源正确访问。若需外部配置,调整文件位置并修改读取路径。修改后重新部署应用即可解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac QT水平布局和垂直布局

首先上代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QPushButton> #include<QVBoxLayout>//垂直布局 #include<QHBoxLayout>//水平布局头文件 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), …

uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas

uniapp中用canvas绘制简单柱形图&#xff0c;小容量&#xff0c;不用插件——简单使用canvas 完整代码 <template><view><!-- 学习数据 --><!-- 头部选项卡 --><view class"navTab"><view :class"listIndexi?activite:"…

[Unity]-[UI]-[Image] 关于UI精灵图资源导入设置的详细解释

Unity UI Sprite UI资源导入详解图片导入项目Texture TypeTexture ShapeAdvanced Setting 高级设置 图片设置案例常见细节问题 知识点详解来源 UI资源导入详解 Unity中的UI资源有图片、矢量图、字体、预制体、图集、动画等等资源。 这其中图片是最重要以及最基础的资源组成&a…

【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 递归、搜索和回溯递归搜索VS 深度优先遍历 VS 深度优先搜索 VS 宽度优先遍历 VS 宽度优先搜索 VS 暴搜回溯与剪枝 1 面试题 08.06. 汉诺塔问题1.1 分析…

快手618购物节招商启动,国补可叠加跨店满减等大促补贴

5月8日&#xff0c;快手电商在杭州召开「破峰2025」商家大会。会上&#xff0c;快手电商C端产品负责人孔慧介绍了快手电商全域经营年度策略以及新锐商家长效经营方法论&#xff0c;并宣布快手618购物节招商报名正式启动。 信任社区生态是快手电商发展的基石&#xff0c;2025年…

AI服务器通常会运用在哪些场景当中?

人工智能行业作为现代科技的杰出代表&#xff0c;在多个领域当中发展其强大的应用能力和价值&#xff0c;随之&#xff0c;AI服务器也在各个行业中日益显现出来&#xff0c;为各个行业提供了强大的计算能力和处理能力&#xff0c;帮助企业处理复杂的大规模数据&#xff0c;本文…

MySQL高可用方案全攻略:选型指南与AI运维实践

MySQL高可用方案全攻略:选型指南与AI运维实践 引言:当数据库成为业务生命线 在数字化时代,数据库就是企业的"心脏"。一次数据库宕机可能导致: 电商网站每秒损失上万元订单游戏公司遭遇玩家大规模流失金融系统引发连锁反应本文将为你揭秘: MySQL主流高可用方案…

电位器如何接入西门子PLC的模拟量输入

1.设计思考 我现在手上有一个三线10kΩ的滑动变阻器&#xff0c;想让其当作模拟量接入西门子PLC中&#xff0c;外部改变电阻&#xff0c;PLC程序中能看到对应的阻值或电压&#xff0c;这样可以练习模拟量输入这个知识点&#xff01; 2.了解模拟量的种类 模拟量一般有电压型和…

MongoDB培训文档大纲(超详细)

第一章&#xff1a;引言 1.1 什么是MongoDB&#xff1f; 定义&#xff1a; MongoDB 是一个开源的 NoSQL 数据库&#xff0c;基于文档模型存储数据。它允许使用 JSON 格式&#xff08;更具体地说是 BSON&#xff09;来存储结构化和半结构化数据。MongoDB 是一个高性能、可扩展且…

新闻发稿筛选媒体核心标准:影响力、适配性与合规性

1. 评估媒体影响力 权威性与公信力&#xff1a;优先选择央级媒体&#xff0c;其报道常被其他平台转载&#xff0c;传播链条长&#xff0c;加分权重高。 传播数据&#xff1a;参考定海区融媒体中心的赋分办法&#xff0c;关注媒体的阅读量、视频播放量等指标&#xff0c;如阅读…

ATH12K驱动框架架构图

ATH12K驱动框架架构图 ATH12K驱动框架架构图(分层描述)I. 顶层架构II. 核心数据结构层次关系III. 主要模块详解1. 核心模块 (Core)2. 硬件抽象层 (HAL)3. 无线管理接口 (WMI)4. 主机目标通信 (HTC)5. 复制引擎 (CE)6. MAC层7. 数据路径 (DP)IV. 关键数据流路径1. 发送数据流 …

sqli-labs靶场18-22关(http头)

目录 less18&#xff08;user-agent&#xff09; less19&#xff08;referer&#xff09; less20&#xff08;cookie&#xff09; less21&#xff08;cookie&#xff09; less22&#xff08;cookie&#xff09; less18&#xff08;user-agent&#xff09; 这里尝试了多次…

​​​​​​​MySQL数据库故障排查指南

一、连接类问题 1. 无法连接数据库 现象&#xff1a;应用或客户端无法连接MySQL服务。 排查步骤&#xff1a; 检查服务状态&#xff1a; bash 复制 下载 systemctl status mysqld # 检查MySQL是否运行 netstat -tuln | grep 3306 # 确认3306端口是否监听 检查网络问…

Github 热点项目 Cursor开源代替,AI代理+可视化编程!支持本地部署的隐私友好型开发神器。

Void编辑器今天必须拥有姓名&#xff01;作为总星数近1.5万的顶流开源工具&#xff0c;它用三大绝活圈粉无数&#xff1a;① 隐私党狂喜&#xff01;所有AI对话直连模型商&#xff0c;你的代码数据绝不留在别人服务器&#xff1b;② 自带时光机功能&#xff0c;AI修改代码时自动…

Quorum协议原理与应用详解

一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议&#xff0c;通过权衡一致性&#xff08;C&#xff09;与可用性&#xff08;A&#xff09;实现数据冗余和最终一致性。其核心规则为&#xff1a; W&#xff08;写成功副本数&#xff09; …

PyTorch_自动微分模块

自动微分 (Autograd) 模块对张量做了进一步的封装&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;在神经网络的反向传播过程中&#xff0c;Autograd 模块基于正向计算的结果对当前的参数进行微分计算&#xff0c;从而实现网络权重参数的更…

34.笔记1

今天&#xff0c;我们回顾回顾曾经的知识。 1.二分 还记得当初的二分吗&#xff1f; 1.一开始的二分 就像下面这个故事&#xff1a; 有一只老鼠&#xff0c;躲在10个大瓷瓶后面。你的任务就是抓住这只老鼠&#xff0c;但在抓的过程会导致你选择的大瓷瓶成为分子碎片。 如…

云原生环境下服务治理体系的构建与落地实践

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:服务治理正在从“框架能力”向“平台能力”演进 随着微服务架构逐步成熟,越来越多的企业开始向云原生迁移,Kubernetes、Service Mesh、Serverless 等新兴技术不断推动系统的基础设施演进。 与…

读取传感器发来的1Byte数据:分低位先行和高位先行的处理方法

目录 一、写在前面 二、伪代码的逻辑实现 1、从高位到低位 2、从低位到高位 一、写在前面 在接收数据之前我们需要事先知道数据的发送规则&#xff0c;是高位先行还是低位先行&#xff0c;并按照规则接收数据&#xff0c;否则收到的数据很可能是错的 高位先行&#xff1a;…

C++ - 函数重载

概念 函数重载允许在同一作用域内定义多个同名函数&#xff0c;但这些函数的参数要满足&#xff1a;参数类型、参数个数&#xff0c;参数顺序不同&#xff08;满足三个中的一个&#xff09;&#xff0c;才能使用函数重载 #include <iostream> using namespace std;// 1…