2016-02-13 119 views
6

的多個版本,我在它的依賴兩個罐子叫拉一個Web應用程序:Maven的 - 相同的依賴

  1. 了Javassist-3.9.0.GA.jar
  2. 了Javassist-3.20.0-GA .jar

當我打包WAR我有這兩個在WEB-INF/lib目錄中,我的問題是,應用程序正在運行,爲什麼我不會有任何問題,因爲顯然我有相同的類在兩個罐子裏,應該有問題?不是嗎?

+1

如果你真的有在同一工件的兩個版本你'war'你做錯了什麼......用默認的Maven和Maven的戰爭插件應該不會有重複的jar文件在你的lib文件夾.... (這聽起來像你手動做的事情,應該讓Maven做) – khmarbaise

+0

謝謝,如果我使用'包'目標來構建戰爭文件,是不是使用maven war插件來做到這一點?如果沒有,那麼Maven-War-plugin有什麼不同來「打包」目標呢? –

+0

'package'不是一個目標,它是一個生命週期如果你在你的pom文件中設置了正確的' war'這應該是開箱即用的......最好的辦法就是看你正在使用的pom文件。 – khmarbaise

回答

14

對於Java,您提供的類的多個版本無關緊要。默認的類加載器只會選擇它可以找到的類路徑中的第一個。

既然你可以運行沒有錯誤的應用程序,這意味着執行下列操作之一:

  • 如果Javassist是-3.9.0.GA.jar首先是在類路徑:您的應用程序不依賴於新javassist-3.20.0-GA.jar中的API或錯誤修正您也可以在這些版本之間更改任何API(在不同版本之間不應該這樣做)

  • if javassist-3.20.0-GA .jar首先在類路徑中:庫向後兼容

我建議:

  • 如果這些依賴關係是在應用程序的不同部分的直接依賴,確保你使用到處都是一樣的版本。最好的方法是修改父POM的dependencyManagement部分中的版本,然後省略依賴項部分中的版本屬性。
  • 如果這些依賴關係是傳遞依賴關係,那麼排除不想使用的依賴關係,以確保在最終應用程序中只有一個版本的庫。還要考慮爲仍然使用舊版本的項目提出問題,並要求他們升級依賴項的版本。
  • 如果需要使用同一庫的兩個不兼容的版本,它具有相同的包和類名的工作,可以考慮使用一個模塊系統,如OSGi的,它支持運行不同版本的相同庫在一定程度上的。
+0

我明白這一點及其對此的合理解釋,但這並不意味着應用程序真的處於危險之中,因爲如果我有一個依賴於依賴於3.9.0.GA中的類的依賴項並且該類在3.20 .2-GA和3.20.0-GA首先在類路徑中,並且依賴性需要3.9.0.GA中該特定類的版本? –

+0

另一個問題是如何找出哪一個是第一個在類路徑中? –

+0

你不能找出哪一個是第一個...這是你的應用程序中的一個大問題...你應該修復這個..其他方面你的應用程序可以運行,有時它會失敗... – khmarbaise

2

回答「有什麼建議如何解決它?」看看Resolving conflicts using the dependency tree。使用命令mvn dependency:tree,您將能夠知道任何依賴關係來自哪裏。當您知道哪些工件取決於javassist時,您可以添加一個排除項以避免其中一個javassist版本。