2010-05-26 293 views
29

我的項目P依賴於依賴項A,依賴項A依賴於依賴項B.我的項目的pom.xml文件包含A作爲依賴項,其jar包含在P的類路徑中。但是,在P的運行時拋出一個NoClassDefFoundError,這是因爲缺少B罐。Maven。傳遞依賴關係

不應該Maven自動下載這些依賴關係嗎?

回答

20

我的項目P依賴於依賴關係A [依賴於依賴關係B [有編譯範圍]的編譯範圍]。

除非B是A的一個optional dependency,B應該是P的用「編譯(*)」範圍的依賴性(參見Dependency Scope表並讀出的註釋),因此應當在運行時可用。

但是,在運行時拋出一個NoClassDefFoundError,這是由於缺少B罐引起的。

由於您在Eclipse下運行項目,因此會爲您設置類路徑,因此我將排除此級別的錯誤。這給我們留下了可選的依賴關係。

PS:研究這類問題的一個非常有用的工具是dependency:tree

+1

重寫最後一句:m2eclipse中的依賴關係層次結構視圖比dependency:tree更方便用戶使用,它甚至會給你一個'exclude'嚮導 – 2010-05-31 14:37:45

+0

@seanizer:True(假設OP使用m2eclipse)。注意['dependency:tree'](http://maven.apache.org/plugins/maven-dependency-plugin)也支持[filtering](http://maven.apache.org/plugins/maven-dependency-插件/示例/過濾-的依賴性-tree.html)。 – 2010-05-31 15:26:22

+0

我假設任何一個使用maven和eclipse的人也使用m2eclipse,因爲它比maven-eclipse-plugin(pom編輯器,存儲庫索引,編輯pom時自動配置更改等)功能更強大,更舒適。當然它也包括過濾:點擊層次結構中的任何工件,只顯示這個工件的層次結構... – 2010-05-31 15:55:32

2

如果這個依賴關係A有一個編譯作用域 - 當然,它應該已經被下載並且在項目的類路徑中可用。但是如果它提供了提供的作用域,因爲提供的deps不會與Maven的應用程序打包在一起。

順便說一句你是怎麼運行這個項目的 - 如果不以正確的方式運行,也可能導致這樣的問題,這是一個非常好的猜測。例如 - 如果你使用maven exec plugin - maven會爲你設置正確的類路徑,否則 - 你應該自己設置它(或者用assembly plugin構建一個依賴關係的jar)。

+0

A列出了B中與「編譯」範圍的依賴; P將A列爲與「編譯」範圍的依賴關係。 B沒有被添加到P的類路徑中。 – Jake 2010-05-26 17:27:42

+0

你沒有回答'你好嗎?'的問題。 – bmargulies 2010-05-26 17:37:05

+0

@bmargulies特赦。我生成Eclipse元數據並將其從Eclipse調試器中運行出來。 – Jake 2010-05-26 17:40:25

-2

在我的情況下,我忘了用-vm參數啓動Eclipse,它應該指向jdk/javaw.exe。

即使5年後的Java EE的編程你還是讓新手犯錯......