Java - 正确获取jar依赖项

时间:2009-05-19 12:22:23

标签: java hibernate spring maven-2 jar

我对Java& maven,所以为了了解我的方式,我决定做一个项目作为学习的手段。

我选择了一个很常见的堆栈:

  • Java 1.6
  • Hibernate(带注释)
  • 春天(带注释)
  • 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 x.x.x与弹簧模块B y.y.y

不兼容

我期望从一个干净的平板开始,版本依赖应该是最小的 - 只需抓住最新版本,一切都应该工作......但事实并非如此。

我预计使用maven会简化这个过程,毫无疑问它会有。

但它肯定远非无痛。我曾经想过,如果模块A需要模块B的特定版本,那么它将在某个地方强制执行,并且可以提供更有意义的消息,只有“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>

由于

玛蒂

2 个答案:

答案 0 :(得分:2)

我发现一件具有挑战性的事情是确定每个包装中的内容,特别是来自Spring。

为此,我发现Netbeans对maven的支持非常出色,因为它可以让您了解每个要求所引入的库。 6.7 Beta包含一个非常出色的图形树,m2eclipse也有一个非常好的图形依赖树。你怎么知道spring-orm包括spring-bean,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的答案所示。

答案 1 :(得分:0)

如果您正在使用eclipse,那么您应该从sonatype http://m2eclipse.sonatype.org/下载maven插件。

这附带了一个有用的依赖关系图形可视化(特别是transitive dependencies - 您未在POM中明确定义的依赖关系),并且还显示了冲突的依赖关系。

更新:根据以下评论,您的里程可能会有所不同