Java 類別載入困境:處理相同Jar 的多個版本
使用Java 函式庫時,遇到需要不同版本的專案並不罕見同一庫的主要版本。雖然人們可能會期望類別載入器能夠整齊地分離這些版本,但實際情況往往更為複雜。
類別載入器的限制
Java 類別載入器並非設計用於明確處理多個版本同一個圖書館的。它遵循父優先委託模型,其中每個類別載入器在嘗試載入它自己之前將類別載入委託給其父類別。這意味著,如果具有相同二進位名稱的兩個類別駐留在由不同類別載入器載入的不同 jar 中,則無論版本為何,都會載入類別路徑層次結構中找到的第一個類別。
類別解析與衝突
當類別載入器嘗試解析一個類別時,它會在以下內容中搜尋order:
- 目前類別載入器
- 父類載入器
- 引導類別載入器
如果層次結構中沒有一個類別載入器可以找到該類,請拋出ClassNotFoundException。雖然類別路徑可能包含多個包含相同類別的 jar,但只會載入一個。在這種情況下,其他 jar 中的類別將無法存取。
處理依賴衝突
要解決此問題,開發人員有多種選擇:
- 版本管理:在整個專案中強制執行特定版本的庫以避免版本衝突。
- 模組系統:利用 Java 9 的模組系統來隔離模組內不同版本的函式庫。
- 類別載入器重寫:建立自訂類別載入器覆寫預設類別載入行為以載入特定版本類別。
- Jar 合併: 將包含不同版本的 jar 合併到單一工件中。
工件連結
在某些情況下,可能需要將多個 jar 視為單一「包」。這可以透過類路徑操作來實現。透過使用「-provided」標誌在類別路徑中指定所需的 jar,類別載入器將從 jar 中載入所有必需的類別。這有效地「連結」了 jar,使它們被視為一個有凝聚力的單元。
結論
雖然類別加載器設計用於處理類別加載,但可以處理多個版本同一個罐子的味道可能具有挑戰性。透過了解類別載入器的行為,開發人員可以減輕潛在的衝突並有效管理專案內的依賴關係。
以上是Java 如何在類別載入中處理相同 JAR 檔案的多個版本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

在Idea中如何設置SpringBoot項目默認運行配置列表在使用IntelliJ...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具