2008-12-16 70 views

回答

29

類路徑地獄是由Java執行的那種動態鏈接的不幸後果。

你的程序是不是一個固定的實體,而是由JVM在特定情況下加載的類的確切集合。

這是非常可能是在情況下會導致因解析規則完全不同的結果在不同的平臺,甚至在同一個相同的命令行。

標準庫可能存在差異(很常見)。圖書館可以彼此隱藏(舊版本甚至可以用來代替新版本)。目錄結構可能會解決問題。同一類的不同版本可能會出現在多個庫中,並且將會使用遇到的第一個類,等等。由於Java按規範使用了首次遇到的策略,所以未知的排序依賴性可能會導致問題。當然,由於這是命令行,它是規範的一部分,所以沒有真正的警告。

這仍然是一個問題。例如,在Mac OS上,來自蘋果的可怕支持意味着你的機器最終會有幾個JVM和幾個JRE,而且你永遠不會輕易地將東西從一個地方放到另一個地方。如果您有被編譯其他庫的具體的,但不同版本的多個庫,你coulld有問題,等

不過,這個問題是不是在Java中所固有的。在90年代編程時,我記得我分享的DLL地獄情況。任何情況下,你必須依靠文件系統中的某些東西來組裝你的程序,而不是有一個定義好的可執行文件,這是一個問題。

然而,這種模式的好處還是很大的,所以我願意忍受這種地獄。在Sun一側也有正確的方向。例如,Java6允許您簡單地用jar指定一個目錄,而不必枚舉它們。

BTW:類路徑也是一個問題,如果你使用的是使用非默認的類加載器的環境。例如,我在Eclipse下運行諸如Hibernate或Digester之類的問題,因爲類加載器不兼容。

2

我覺得「類路徑地獄」是指當一個Java應用程序的類路徑中只能使用CLASSPATH環境變量設置的時間。這導致許多應用程序需要更改全局系統配置(每個操作系統都不同),應用程序之間的版本衝突以及一般混淆。

2

這是一個較爲具體的例子:

當兩個庫(或庫 和應用)需要不同的版本相同的第三 庫。如果第三個庫的兩個版本都使用相同的類 名稱,則無法將同一個類加載器的第三個庫的兩個版本都加載到 。

欲瞭解更多示例,請參閱http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell