2011-12-04 65 views
1

相關:manage conflict on java classpath如何管理圖書館衝突? (相同的封裝,不同版本)

也涉及:Java Classloader - how to reference different versions of a jar

我在這各擁有兩個jar文件有它包含在jar文件本身的依賴,但兩者是不同的版。

a.jar -> has c.class/c2.class/c3.class/.. version 0.3 in it

b.jar -> has c.class/c2.class/c3.class/.. version 1.0 in it

但是,當我試圖在同一個項目中使用這兩者。它似乎只使用c.class從一個罐子,但沒有另一個。由於這兩個版本的API都非常不同,所以這成爲一個問題。無論如何要告訴他們只需從各自的jar中使用c.class?我不能在這裏修改a.jar和b.jar。

btw。快速搜索後,似乎人們建議OSGI和類加載器,但我知道它應該是最快的方式來處理它? (已經讀了一些關於classloader的內容,但仍不確定如何使用它)。

編輯:我更喜歡使用原始庫他們打包,因爲我已經分別評估這兩個jar(他們是文本挖掘工具具有相同的後端,但版本是非常不同的)。現在我想將它們兩個整合爲一個,並儘可能地使環境接近原始。 現在我按照Travis Webb的解決方案,但我仍然想知道爲什麼jar不分開這兩個庫。

+0

相關問題:http://stackoverflow.com/questions/274317/mixing-different-versions-of-java-libraries –

回答

3

最快方式:

提取a.jar,刪除你不想要的東西,並重新罐子它。一個JAR是相同的到一個zip文件,這意味着你可以創建一個普通的zip文件並將其重命名爲.jar

順便說一句,這不是你的錯。無論你從哪個罐子獲得這些罐子,都是白癡,因爲它們包含外部依賴關係,並且他們不應該這樣做。

+0

謝謝,我試過你的解決方案,它的工作雖然有點不同於我的原始目標(分開他們的環境)。順便說一句。這些程序是從生物醫學領域產生的,正常的軟件實踐是不存在的。 –

+0

我認爲我們應該努力通過確保它只符合我們的利益來驗證罐子。 – sskumar86