2016-04-14 98 views
3

我已經做了大量的搜索,並沒有找到這個問題的答案。也許這不能做,但這裏是我需要用於不同類的jar文件的兩個版本

  1. a.jar文件取決於SomeLibrary-V2.jar
  2. 的Class1在a.jar文件取決於(間接)上SomeLibrary-V1.jar。

,我想

  1. a.jar文件從V2
  2. 1類(和它觸發裝載的類)得到它的類從a.jar文件得到V1類或類有必要的。

我可以寫我自己的child-first classloader在需要時按名稱加載Class1。這個類加載器將首先搜索SomeLibrary-V1.jar(在父類加載器之前)。但是,Class1的類加載器將不會被設置爲我的類加載器,因爲它將推遲到父級。這意味着當Class1試圖加載一個我想從SomeLibrary-V1.jar來的類時,我的子類加載器將不會被使用。

我想我需要我的類加載器設置爲Class1類的類加載器。我已經看過自省將類加載器設置爲我的類加載器實例,但Class對象的類加載器字段未公開。另一種方法可能是從我的類加載器調用definedClass(),但後來我無法真正使用父類。

我見過this但是那裏的答案建議寫一個類加載器,但沒有提供任何細節。我在這裏提供了一些細節,提出瞭解決方案的其他問題/問題(我希望 - 我沒有代表添加註釋)。

我希望我只是在這裏失去了一些東西。謝謝你的幫助。

+0

[Java Classloader可能的重複 - 如何引用不同版本的jar](http://stackoverflow.com/questions/1553567/java-classloader-how-to-reference-different-versions-of-a-罐子) – Ferrybig

+0

只是爲了激發這裏的問題。我正在構建RESTful服務,然後需要使用Spark添加一些功能。 Spark使用Jersey 1.x,我開始使用Jersey 2.x開發一條路徑。 –

回答

3

歡迎來到JAR Hell!這是不容易的,因爲類路徑在Java中工作的簡單方式。

有解決方案,但不容易,快速修復。你可以做各種類型的加載器技巧,就像你已經發現的那樣,或者使用一個模塊系統,比如OSGi

希望這將在未來變得更好,當Java 9出來時,將會有一個標準的模塊系統。

0

雖然解決方案是可行的,但任何這樣的解決方案都將是一個非常脆弱的解決方案,幾乎肯定會導致更多的問題,然後它的價值。我會說,如果它是在所有可能的避免依賴不同版本的相同的庫。可以看看這樣一個事實,即你有這樣的依賴性是一個問題的症狀,並試圖解決根本原因。

相關問題