2013-07-25 80 views
2

例如,java程序如何執行庫版本?

如果我有一個程序a.jar取決於log4j-1.0.jar,我做到了,它在我的機器上工作正常。

後來,我將我的程序複製到另一臺機器上,它有log4j-2.0.jar,它與我的程序不兼容。

java運行時如何發現?在代碼中的例外?這聽起來太可怕了...

THanks

回答

0

我遇到過這種情況一次。是的,如果您在Class路徑中提供了兩個不同的log4j庫版本,Java運行時將會發現它們兩個,並且不保證將被拾取,並且如果庫不向後兼容,可能會特別導致異常/錯誤

大多數Java類加載器不會對加載庫的順序提供任何保證,所以您確實需要確保不會在您的類路徑中複製依賴關係。

+1

它如何回答這個問題,就是如何解決這個問題。 –

+0

在類路徑中不應該有兩個版本的同一個庫。如果你這樣做,你不能保證行爲。所以唯一的出路是找到並刪除多個版本的罐子。 –

+0

你不明白這裏的問題。類路徑中沒有兩個版本的jar。類路徑中jar版本的問題與用於編譯類的jar版本不同。 –

0

這個問題在Web容器的上下文中是有意義的。如果我們正在討論桌面或JNLP應用程序,那麼答案很簡單:所有庫jar依賴項都應該與應用程序一起打包。除非我們明確地將它放在那裏,否則我們決不能依賴某些庫文件在客戶端機器的類路徑上,在這種情況下,我們會知道找到了哪個版本的庫。

在Web應用程序的情況下,情況與問題所暗示的一樣可怕。例如,我們可能會在Tomcat的/ lib目錄中放置一些庫文件,然後部署一些取決於其中一個版本的war文件。唯一的失敗依賴的跡象將是一些(可能是非顯而易見的)異常。由於REST風格的Web服務的澤西版本的差異,我正在拉我的頭髮。

該解決方案再次將所有內容打包到您的應用程序中。這可能會使戰爭文件非常大,但重新部署可以通過更新相關文件然後重新啓動容器來完成。一些雲服務提供商迫使我們這樣做,因爲開發人員無法訪問shared/lib目錄。