【问题标题】:Java - getting jar dependencies rightJava - 正确获取 jar 依赖项
【发布时间】:2010-10-27 07:32:20
【问题描述】:

我对 Java 和 maven 比较陌生,因此为了了解我的方法,我决定做一个项目作为学习的手段。

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

  • Java 1.6
  • 休眠(带注释)
  • Spring(带注释)
  • JUnit 4
  • 雄猫
  • Oracle XE / In-mem hsqldb

到目前为止,我遇到的最大问题之一是正确组合 jar 版本以获得稳定的环境。两个多月后,我是still fighting with,这是一个问题。

我经常抛出 noSuchMethod 或 classNotFound 异常,结果证明 Spring 模块 A x.x.x 与 Hibernate 模块 B y.y.y 不兼容。甚至,通常情况下,spring 模块 A x.x.x 与 spring 模块 B y.y.y 不兼容

我希望从头开始,版本依赖性应该是最小的 - 只需获取最新版本,一切都应该工作......但事实并非如此。

我预计使用 maven 会简化这个过程,毫无疑问它确实做到了。

但这肯定远非无痛。我曾想过,如果模块 A 需要模块 B 的特定版本,那么它会在某个地方强制执行,并且肯定会提供更有意义的消息,而不仅仅是“noSuchMethod”。

此外,我发现这些问题的唯一方法似乎是尝试一个新的方法调用,得到可怕的 noSuchMethod 错误,然后开始谷歌搜索。

我是否在此过程中错过了一些让我自己变得比需要的更困难的事情?

作为参考,这是我的 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>

谢谢

马蒂

【问题讨论】:

  • 你能提供一些你遇到的错误的例子吗?

标签: java hibernate spring maven-2 jar


【解决方案1】:

如果你使用的是 eclipse,那么你应该从这里http://m2eclipse.sonatype.org/ 的 sonatype 下载 maven 插件。

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

更新:根据下面的 cmets,您的里程可能会有所不同

【讨论】:

  • 我使用 m2eclipse 已经有一段时间了,发现它非常不稳定,尤其是在 WTP 和嵌套模块周围。但是,我想我会安装 POM 编辑器,这样我就可以看到这些传递依赖项。当我尝试查看它们时,m2eclipse 中发生的第一件事是什么? “java.lang.NoSuchMethodError”。我喜欢讽刺。
  • 我发现 m2eclipse“列表视图”比图形视图更具可读性。它有更好的交互。例如点击 commons-logging 会缩小范围,只显示使用它的地方。
  • 尝试在 Eclipse 中运行 dependency:tree 目标。如果您在使用图形插件时遇到问题,我认为这可能会有所帮助。
【解决方案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 的答案所示。

【讨论】:

  • 仅供参考 - Eclipse 的 m2eclipse 插件还具有绘制依赖关系图的能力
  • 另外我认为你可以使用 mvn help:effective-pom 来分解所有依赖项
  • 我同意你的观点,确定与 Spring 一起使用的必要模块是困难的。如果有一个“地图”指定哪些包是哪些模块的一部分,那就太好了。有人知道这样的参考吗?
  • mvnrepository.com 会,但它基本上只是列出了您尝试使用的工件的 POM 中的条目。例如:mvnrepository.com/artifact/org.springframework/spring-orm/2.5.6 列出了 spring-orm 使用的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 2013-09-05
  • 2017-12-27
  • 2021-12-10
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多