2011-04-12 29 views
6

我在我的pom中有兩個依賴關係javaee-apihibernate-entitymanager。但是它們並不能很好地結合在一起:只要我添加javaee-api,我的所有單元測試就會因爲java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation而中斷。沒有javaee-api,一切正常。這是爲什麼?Maven:hibernate-entitymanager和javaee-api一起打破我的單元測試

(這個問題是爲了適應問題被編輯;))

+0

您使用的是什麼應用程序服務器,Jboss,Glassfish? – somid3 2011-04-12 16:52:22

+0

單元測試時未涉及應用程序服務器,但該應用程序稍後將在JBoss 6中運行。 – atamanroman 2011-04-12 20:49:31

回答

5

Maven依賴沒有順序 ,但提供的scopes概念。

所以,你需要做的是,使用的範圍,以建立相關性集合權的內容:

  • 編譯時
  • 運行在服務器(使用例如provided的是需要的依賴在編譯時,但會由服務器來提供,所以您的應用程序/必須不包含他們
  • 測試時間:使用test範圍增加(JUnit的舉例)
那些只需要進行測試的依賴

在你的特殊情況下,它看起來像javax.validation接口庫在測試中不是aviv。可能他們不會被包含在javaee-api中。如果是這樣的話,再加入:

 <dependency> 
     <groupId>javax.validation</groupId> 
     <artifactId>validation-api</artifactId> 
     <version>1.0.0.GA</version> 
     <scope>test</scope> 
    </dependency> 

但要小心,你的解釋,關於什麼是包含在服務器,並且所描述的行爲有些陌生。 - 我建議仔細檢查服務器提供的內容以及繼電器包含的內容。但可能我錯了,只需要javax.validation測試明確

之所以問題只occoures當包括javaee-api,可能是,那使用javax驗證有時只開啓,當實現在aviable類路徑。


在某些情況下依賴關係的順序。這個「問題」是,如果在兩個地方(直接和不正確)引用庫/依賴關係,並且引用同一個庫異常的版本,Maven必須決定使用哪個版本。

第一個也是最重要的標準是依賴樹中引用的深度。如果你直接在你的項目POM中引用庫,那麼這將是所有其他的。如果圖書館直接由您直接提供的圖書館提供,那麼這將主宰所有其他地方,這是一種更爲間接的方式。

但是,如果在依賴關係樹的相同深度中有兩個引用(對於不同版本中的同一個庫),第一個將會獲勝。 (more details)。

首先,

+0

我確定什麼是由jboss提供的,什麼不是。範圍也是正確的。但是當javaee-api在類路徑中時,hibernate-entitymanager可能會在運行時加載一些驗證內容;這會解釋奇怪的行爲。在此先感謝,我會在明天檢查。 – atamanroman 2011-04-12 20:53:39

+0

我添加了依賴驗證 - api關閉了bean驗證,現在一切正常 - 你是對的! – atamanroman 2011-04-13 07:23:16

+0

我在依賴關係的底部列表中添加了依賴項,並且不起作用。但搬到頂級作品。很奇怪。 – 2012-08-02 13:44:35

0

據我所知,在Maven2的依賴關係的順序不保留,還有當你執行這些依賴關係如何出現在最終的類路徑的順序不能保證你的碼。在你的情況下,我會在依賴結構中「排除」重疊的庫。

查看here Maven排除文檔。

鑑於庫版本匹配的複雜性,我建議您從Hibernate Maven examples之一開始,並將其變形爲您的項目。

我希望這會有所幫助。

相關問題