2009-05-19 78 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