class path resource [] cannot be resolved to absolute file path

問題情景

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包內。

原因分析

當應用程序打包成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.pswp.cn/diannao/82271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82271.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

19、HashTable(哈希)、位圖的實現和布隆過濾器的介紹

一、了解哈希【散列表】 1、哈希的結構 在STL中&#xff0c;HashTable是一個重要的底層數據結構, 無序關聯容器包括unordered_set, unordered_map內部都是基于哈希表實現 哈希表又稱散列表&#xff0c;一種以「key-value」形式存儲數據的數據結構。哈希函數&#xff1a;負責將…

基于 Flask的深度學習模型部署服務端詳解

基于 Flask 的深度學習模型部署服務端詳解 在深度學習領域&#xff0c;訓練出一個高精度的模型只是第一步&#xff0c;將其部署到生產環境中&#xff0c;為實際業務提供服務才是最終目標。本文將詳細解析一個基于 Flask 和 PyTorch 的深度學習模型部署服務端代碼&#xff0c;幫…

Vue3 + Node.js 實現客服實時聊天系統(WebSocket + Socket.IO 詳解)

Node.js 實現客服實時聊天系統&#xff08;WebSocket Socket.IO 詳解&#xff09; 一、為什么選擇 WebSocket&#xff1f; 想象一下淘寶客服的聊天窗口&#xff1a;你發消息&#xff0c;客服立刻就能看到并回復。這種即時通訊效果是如何實現的呢&#xff1f;我們使用 Vue3 作…

MySQL數據庫與表結構操作指南

前言&#xff1a;本文系統梳理MySQL核心操作語句。內容覆蓋建庫建表、結構調整、數據遷移全流程&#xff08;包含創建/修改/刪除/備份場景&#xff09;。希望它們能幫你快速解決問題。 庫結構操作 一、庫的創建 一個庫的簡單創建&#xff1a; create database 庫名; 注意&am…

【WEB3】區塊鏈、隱私計算、AI和Web3.0——數據民主化(1)

區塊鏈、隱私計算、AI&#xff0c;是未來Web3.0至關重要的三項技術。 1.數據民主化問題 數據在整個生命周期&#xff08;生產、傳輸、處理、存儲&#xff09;內的隱私安全&#xff0c;則是Web3.0在初始階段首要解決的問題。 數據民主化旨在打破數據壟斷&#xff0c;讓個體能…

C語言—指針2

1. const 修飾變量 1.1 const修飾變量 變量被const修飾時&#xff0c;變量此時為常變量&#xff0c;本質為常量&#xff0c;語法上不可被修改&#xff0c;但是如果此時需要修改變量值&#xff0c;可以通過指針的方式修改。 雖然此時通過指針的方式確實修改了變量的值&#xff…

高級架構軟考之網絡OSI網絡模型

高級架構軟考之網絡&#xff1a; 1.OSI網絡模型&#xff1a; a.物理層&#xff1a; a.物理傳輸介質物理連接&#xff0c;負責數據傳輸&#xff0c;并監控數據 b.傳輸單位&#xff1a;bit c.協議&#xff1a; d:對應設備&#xff1a;中繼器、集線器 b.數據鏈路層&#xff1a; a.…

el-table計算表頭列寬,不換行顯示

1、在utils.js中封裝renderHeader方法 2、在el-table-column中引入&#xff1a; 3、頁面展示&#xff1a;

MySQL OCP和Oracle OCP怎么選?

近期oracle 為慶祝 MySQL 數據庫發布 30 周年&#xff0c;Oracle 官方推出限時福利&#xff1a;2025 年 4 月 20 日至 7 月 31 日期間&#xff0c;所有人均可免費報考 MySQL OCP&#xff08;Oracle Certified Professional&#xff09;認證考試&#xff08;具體可查看MySQL OCP…

2025最新免費視頻號下載工具!支持Win/Mac,一鍵解析原畫質+封面

軟件介紹 適用于Windows 2025 最新5月蝴蝶視頻號下載工具&#xff0c;免費使用&#xff0c;無廣告且免費&#xff0c;支持對原視頻和封面進行解析下載&#xff0c;親測可用&#xff0c;現在很多工具都失效了&#xff0c;難得的幾款下載視頻號工具&#xff0c;大家且用且珍…

Python學習之路(八)-多線程和多進程淺析

在 Python 中,多線程(Multithreading) 和 多進程(Multiprocessing) 是實現并發編程的兩種主要方式。它們各有優劣,適用于不同的場景。 一、基本概念 特性多線程(threading)多進程(multiprocessing)并發模型線程共享內存空間每個進程擁有獨立內存空間GIL(全局解釋器鎖…

Spark緩存--persist方法

1. 功能本質 persist&#xff1a;這是一個通用的持久化方法&#xff0c;能夠指定多種不同的存儲級別。存儲級別決定了數據的存儲位置&#xff08;如內存、磁盤&#xff09;以及存儲形式&#xff08;如是否序列化&#xff09;。 2. 存儲級別指定 persist&#xff1a;可以通過傳入…

裸辭8年前端的面試筆記——JavaScript篇(一)

裸辭后的第二個月開始準備找工作&#xff0c;今天是第三天目前還沒有面試&#xff0c;現在的行情是一言難盡&#xff0c;都在瘋狂的壓價。 下邊是今天復習的個人筆記 一、事件循環 JavaScript 的事件循環&#xff08;Event Loop&#xff09;是其實現異步編程的關鍵機制。 從…

什么是死信隊列?死信隊列是如何導致的?

死信交換機&#xff08;Dead Letter Exchange&#xff0c;DLX&#xff09; 定義&#xff1a;死信交換機是一種特殊的交換機&#xff0c;專門用于**接收從其他隊列中因特定原因變成死信的消息**。它的本質還是交換機&#xff0c;遵循RabbitMQ中交換機的基本工作原理&#xff0c…

9. 從《蜀道難》學CSS基礎:三種選擇器的實戰解析

引言&#xff1a;當古詩遇上現代網頁設計 今天我們通過李白的經典詩作《蜀道難》來學習CSS的三種核心選擇器。這種古今結合的學習方式&#xff0c;既能感受中華詩詞的魅力&#xff0c;又能掌握實用的網頁設計技能。讓我們開始這場穿越時空的技術之旅吧&#xff01; 一、HTML骨架…

三角網格減面算法及其代表的算法庫都有哪些?

以下是三角網格減面算法及其代表庫/工具的詳細分類&#xff0c;涵蓋經典算法和現代實現&#xff1a; ??1. 頂點聚類&#xff08;Vertex Clustering&#xff09;?? ??原理??&#xff1a;將網格空間劃分為體素柵格&#xff0c;合并每個柵格內的頂點。??特點??&#…

URP - 屏幕圖像(_CameraOpaqueTexture)

首先需要在unity中開啟屏幕圖像開關才可以使用該紋理 同樣只有不透明對象才能被渲染到屏幕圖像中 若想要該對象不被渲染到屏幕圖像中&#xff0c;可以將其Shader的渲染隊列改為 "Queue" "Transparent" 如何在Shader中使用_CameraOpaqueTexture&#xf…

vue 和 html 的區別

使用 Vue.js 和原生 HTML 開發 Web 應用有顯著的區別&#xff0c;主要體現在開發模式、功能擴展、性能優化和維護性等方面。以下是兩者的對比分析&#xff1a; &#x1f9f1; 原生 HTML&#xff08;HTML CSS JavaScript&#xff09; 特點&#xff1a; 靜態結構&#xff1a;H…

LeetCode[226] 翻轉二叉樹

思路&#xff1a; 使用遞歸&#xff0c;歸根結底還是左右節點互相倒&#xff0c;那么肯定需要一個temp節點在中間傳遞&#xff0c;最后就是遞歸&#xff0c;沒什么說的 代碼&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int …

冪等的幾種解決方案以及實踐

目錄 什么是冪等&#xff1f; 解決冪等的常見解決方案&#xff1a; 唯一標識符案例 數據庫唯一約束 案例 樂觀鎖案例 分布式鎖&#xff08;Distributed Locking&#xff09; 實踐精選方案 首先 為什么不直接使用分布式鎖呢&#xff1f; 自定義實現冪等組件&#xff01…