2009-05-19 143 views
4

我對Java的相對較新的& maven,所以爲了瞭解我的方式,我決定做一個項目作爲學習的一種手段。Java - 獲取jar依賴關係權

我拿起一個很常見的堆棧:

  • 的Java 1.6
  • 休眠(帶註釋)
  • 春季(帶註釋)
  • 的JUnit 4
  • Tomcat的
  • 的Oracle XE/In-mem hsqldb

迄今爲止,我遇到的最大問題之一是獲得jar版本的正確組合以獲得穩定的環境。兩個月後,我的問題是still fighting with

很多時候我得到noSuchMethod或classNotFound異常拋出,並且事實證明Spring模塊A x.x.x與Hibernate模塊B y.y.y不兼容。甚至,正如通常一樣,彈簧模塊A xxx與彈簧模塊B不兼容yyy

我期望從乾淨的版本開始,版本依賴應該是最小的 - 只需抓住最新版本,一切都應該工作。但事實並非如此。

我預計使用maven會簡化這個過程,毫無疑問它已經。

但它絕對不是無痛。我曾經想過,如果模塊A需要特定版本的模塊B,它會在該行的某處執行,並且certinaly會提供更有意義的消息,只是「noSuchMethod」。

此外,似乎我發現這些問題的唯一方法是嘗試新方法調用,獲取可怕的noSuchMethod錯誤,並開始使用Google搜索。

我在這裏錯過了一些讓自己變得更加困難的事情嗎?

作爲參考,這裏是我的pom的依賴部分...如果您發現任何可怕的非標準,請讓我知道!

<dependencies> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.4</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ojdbc</groupId> 
     <artifactId>ojdbc</artifactId> 
     <version>14</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.3.2</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency><!-- java bytecode processor --> 
     <groupId>javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.8.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>hsqldb</groupId> 
     <artifactId>hsqldb</artifactId> 
     <version>1.8.0.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.dbunit</groupId> 
     <artifactId>dbunit</artifactId> 
     <version>2.4.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.4.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-commons-annotations</artifactId> 
     <version>3.3.0.ga</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>3.3.1.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>3.1.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.4.0.GA</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.3</version> 
    </dependency> 
</dependencies> 

感謝

馬蒂

+1

你能提供一些你得到的錯誤的例子嗎? – 2009-05-19 12:40:27

回答

2

我發現有一件事情是具有挑戰性的,那就是確定每個軟件包中的內容,尤其是Spring。

爲此,我發現Netbeans對maven的支持非常突出,它讓你知道每個需求所引入的庫。 6.7 Beta包含一個出色的圖形樹,m2eclipse也有一個非常漂亮的圖形依賴樹。你還會怎麼知道spring-orm包括spring-beans,spring-core,spring-context和spring-tx?您可以使用命令行中的dependency plugin來詢問maven的依賴關係,但圖形表示非常方便。 dependency:tree是您想要運行的目標。顯然你也可以從Netbeans或Eclipse運行它。

所以,作爲你的一個碰撞的例子:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-annotations</artifactId> 
    <version>3.4.0.GA</version> 
</dependency> 

實際上包括hibernate-commons-annotations-3.1.0.GA不是3.3。它還包括hibernate-core-3.3.0.SP1,而不是3.3.1.GA.

我將從您的「最大」組件開始,並開始查看已包含哪些部件並僅添加缺失的部件。即使如此,請仔細檢查您是否沒有重複的依賴關係,如果需要,請排除this question答案中顯示的副本。

0

如果你使用Eclipse,那麼你應該從這裏Sonatype的下載http://m2eclipse.sonatype.org/的Maven插件。

這附帶了一個有用的圖形可視化(尤其是transitive dependencies - 您未在POM中明確定義的依賴關係),並且還顯示了衝突的依賴關係。

更新:從下面的評論,您的里程可能會有所不同

+0

我一直在使用m2eclipse,並發現它可以非常片狀,特別是在WTP和嵌套模塊周圍。 但是,我想我會安裝POM編輯器,所以我可以看到這些傳遞依賴。 當我試圖查看它們時,在m2eclipse中發生的第一件事? 「java.lang.NoSuchMethodError」。我喜歡諷刺。 – 2009-05-19 14:10:45

+0

我發現m2eclipse的「列表視圖」比圖形視圖更可讀。它有更好的互動。例如點擊commons-logging將縮小範圍並向您顯示使用它的地方。 – 2009-05-19 14:11:26