簡體   English   中英

如何在運行時解決jar沖突?

[英]How to resolve jar conflicts in runtime?

我有兩個罐子有沖突。 它們都包含一個具有相同包名和類名的類。 由於同樣的原因,我無法刪除其中任何一個。

那么,有什么方法可以解決這個問題嗎? 理想情況下,我希望有一種方法可以讓我決定在運行時應該調用jar的類。

我非常感謝任何人的幫助。

您可以使用不同的名稱在項目文件夾中創建包結構(與沖突的jar中的包結構相同),並從任何jar中復制相應的內容。 使用jar中的一個包和你項目中的另一個包(你剛剛創建的新包)我最近做了這個並且它有效。

祝好運!

在這種情況下你的選擇是。

1.(最佳方式)修改應用程序代碼以使用最新版本的jar。 如果您的程序依賴於另一個依賴於過時jar文件的插件,請檢查最新版本的插件。

  1. 使用OSGi

  2. 使用兩個類加載器。 需要研究一點理論,有時可能會導致意外錯誤。

現在我不打算舉例,因為下面的鏈接中有大量信息和示例可以幫助您

Java,Classpath,Classloading =>同一個jar /項目的多個版本

Jar hell:如何在運行時使用類加載器將一個jar庫版本替換為另一個jar庫版本

http://java.dzone.com/articles/java-classloader-handling

http://javarevisited.blogspot.in/2012/12/how-classloader-works-in-java.html

任何動態鏈接的東西都必須有一些方法來區分運行時鏈接的內容。 這是包層次結構的全部要點,以划分代碼。 您可以解決相同類名的問題,但是一旦包相同,我就不知道強制JVM鏈接到另一個的方法。

您可以使用不同的類加載器並在不同的沙箱中運行沖突的組件。

如果兩個jar都在類路徑上,並且您正在使用系統類加載機制,則無法動態選擇要使用的jar。 Java類加載會選擇第一個類文件。

這是一個古老的主題,但有一個JAR沖突的解決方案,但它只適用於JAVA 8.您可以將沖突的JAR移動到兩個單獨的文件夾中,然后在“java.endorsed.dirs”屬性中以正確的順序提及它們。 這將強制您的應用程序按指定的順序預加載已批准的JAR及其類,從而強制在調用后使用所需的類。 我為我的應用程序做了這個,它在JBoss上運行並且有2個JAR,它們具有完全相同的類和包。 復雜性是我最終支持23個JAR而不是2個,因為存在依賴關系,但最終解決方法有效 - 真正的問題已得到解決。 不幸的是,從Java8開始刪除了對java.endorsed.dirs的支持。 如果有人知道如何為最新的Java做類似的技巧,請分享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM