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