2012-04-25 45 views
4

在Java中,我最近遇到了一個案例,我得到了兩個不同的jar,每個jar都定義了一個類。問題是這些罐子中的一個已經過時,而且有問題的課程缺少一種存在於一個罐子中而不存在於其他罐子中的方法。從兩個衝突的瓶子中導入類時,使用哪一個?

所以,我得到一個錯誤,代碼中使用的方法無法找到。我最終能夠通過移除舊的jar來解決這個問題,以便導入正確的jar。

許多人使用這個相同的代碼(與相同的兩個,衝突,導入瓶),並沒有這個問題。所以,他們一定是導入了最新的jar。

我的問題是這是什麼導致我導入一個jar在另一個?什麼邏輯決定哪些是「使用」?

謝謝!

回答

6

根據訂單。第一個將被使用,第二個將開始引發問題。

請確保您不包含同一班級的不同版本。因爲這個,你可能會遇到奇怪的錯誤。

+0

有一個稱爲OSGi的東西解決這個問題。 OSGi允許您輕鬆定義JAR之間的依賴關係,因此您可以在JAR中擁有給定類的各種版本,並選擇要使用哪個類。 – 2012-04-25 17:19:12

+0

@PiotrKochański - OSGi可能是一個矯枉過正的問題:-) – mrab 2012-04-25 17:21:36

+0

@mrab通常它是:),除非你想編寫應用程序服務器 – 2012-04-25 17:27:45

1

看看你的CLASSPATH。你的jar文件以什麼順序出現在CLASSPATH

如果你沒有明確地設置CLASSPATH變量(或者命令行參數或者你的框架找到類),那麼設置它以使你想要的類更早出現。

2

類路徑決定順序的方式與您PATH確定您將運行哪個程序的方式相同,如果您有多個程序名稱相同。

你可以得到莫名其妙的錯誤,但大部分有罐子的多個版本的時候是沒有問題的(這意味着它可能已經存在了一段時間,很難測試)