2011-01-06 65 views
2

想象一下,我正在開發具有B和C兩個依賴項的模塊A.如果B依賴於模塊D 2.0版,但C依賴於D 3.0版,該怎麼辦?更糟糕的是,讓D-3.0不兼容D-2.0(例如改變了接口),並且B不再支持B,並且沒有可以與新版本D一起工作的B的新版本。類路徑中的類版本問題

有什麼辦法可以運行與B和C依賴關係的A? 有什麼辦法讓一些不同類的版本能夠正確地從classpath中加載和使用嗎?

感謝您的意見。

回答

4

OSGi就是這樣。 :)我仍然在學習這一點,但至少它解決了這個問題,被稱爲Jar地獄。看到這裏http://www.osgi.org/About/WhyOSGi

版本控制 - OSGi技術解決了JAR地獄。 JAR地獄是庫A與庫B一起工作的問題;版本= 2,但庫C只能與B;版本= 3一起工作。在標準的Java中,你運氣不好。在OSGi環境中,所有捆綁包都經過仔細的版本控制,只有可以協作的捆綁包在同一個類空間中連接在一起。這允許包A和C與它們自己的庫一起運行。雖然不建議設計具有此版本問題的系統,但在某些情況下它可能是一種挽救生命的方法。

+0

謝謝,明確的答案。我徘徊爲什麼核心Java沒有原生支持類版本。這對於我來說似乎是VM的基本問題。 – 2011-01-06 16:09:43

2

您可能會發現這個重新打包工具很有用。 http://code.google.com/p/jarjar/這允許您重命名一個包。 (假設不兼容的庫具有相同的包)一旦你重命名了一個或兩個,你可以使用不同的名稱來分配你想要使用的包/庫。

我已經看到這用於創建一個庫,其中五個不同版本的xerces,可以通過包選擇。 :P

注意:JRE的地方下的com.sun嵌入式封裝*與像com.sun.org.apache包*

0

是否可以這樣解決的是非常依賴於你有依賴關係的類型。如果他們是直接的編譯時間依賴性,那麼你有一個很大的問題,可能不得不做一些重新設計。

OSGi可能會提供幫助,但前提是依賴關係是運行時並通過接口作爲OSGi服務訪問。通過這種方式,每個使用的服務都是使用自己定義的依賴關係(和版本)創建的,並且只通過界面向用戶公開。消費者只會對該接口產生依賴。因此,在你的情況下,如果你只有B和C中沒有直接引用D的類的引用,你應該能夠使用OSGi。另一方面,如果您從B和C中引用了直接引用D類的類,這不會解決您的問題,因爲您的模塊將被迫使用適當的版本導入包,並且您的衝突仍然會存在。