的多個版本,我在它的依賴兩個罐子叫拉一個Web應用程序:Maven的 - 相同的依賴
- 了Javassist-3.9.0.GA.jar
- 了Javassist-3.20.0-GA .jar
當我打包WAR我有這兩個在WEB-INF/lib目錄中,我的問題是,應用程序正在運行,爲什麼我不會有任何問題,因爲顯然我有相同的類在兩個罐子裏,應該有問題?不是嗎?
的多個版本,我在它的依賴兩個罐子叫拉一個Web應用程序:Maven的 - 相同的依賴
當我打包WAR我有這兩個在WEB-INF/lib目錄中,我的問題是,應用程序正在運行,爲什麼我不會有任何問題,因爲顯然我有相同的類在兩個罐子裏,應該有問題?不是嗎?
對於Java,您提供的類的多個版本無關緊要。默認的類加載器只會選擇它可以找到的類路徑中的第一個。
既然你可以運行沒有錯誤的應用程序,這意味着執行下列操作之一:
如果Javassist是-3.9.0.GA.jar首先是在類路徑:您的應用程序不依賴於新javassist-3.20.0-GA.jar中的API或錯誤修正您也可以在這些版本之間更改任何API(在不同版本之間不應該這樣做)
if javassist-3.20.0-GA .jar首先在類路徑中:庫向後兼容
我建議:
我明白這一點及其對此的合理解釋,但這並不意味着應用程序真的處於危險之中,因爲如果我有一個依賴於依賴於3.9.0.GA中的類的依賴項並且該類在3.20 .2-GA和3.20.0-GA首先在類路徑中,並且依賴性需要3.9.0.GA中該特定類的版本? –
另一個問題是如何找出哪一個是第一個在類路徑中? –
你不能找出哪一個是第一個...這是你的應用程序中的一個大問題...你應該修復這個..其他方面你的應用程序可以運行,有時它會失敗... – khmarbaise
回答「有什麼建議如何解決它?」看看Resolving conflicts using the dependency tree。使用命令mvn dependency:tree
,您將能夠知道任何依賴關係來自哪裏。當您知道哪些工件取決於javassist時,您可以添加一個排除項以避免其中一個javassist版本。
如果你真的有在同一工件的兩個版本你'war'你做錯了什麼......用默認的Maven和Maven的戰爭插件應該不會有重複的jar文件在你的lib文件夾.... (這聽起來像你手動做的事情,應該讓Maven做) – khmarbaise
謝謝,如果我使用'包'目標來構建戰爭文件,是不是使用maven war插件來做到這一點?如果沒有,那麼Maven-War-plugin有什麼不同來「打包」目標呢? –
'package'不是一個目標,它是一個生命週期如果你在你的pom文件中設置了正確的' war '這應該是開箱即用的......最好的辦法就是看你正在使用的pom文件。 –
khmarbaise