繁体   English   中英

Java-正确获取jar依赖项

[英]Java - getting jar dependencies right

我是Java和Maven的新手,因此为了了解自己的方式,我决定做一个项目来学习。

我选择了一个非常普通的堆栈:

  • Java 1.6
  • 休眠(带有注释)
  • 春季(带注释)
  • JUnit 4
  • 雄猫
  • Oracle XE /内存中hsqldb

到目前为止,我遇到的最大问题之一是如何正确组合jar版本以获得稳定的环境。 这是我两个多月后仍在努力解决的问题。

我经常会抛出noSuchMethod或classNotFound异常,结果是Spring模块A xxx与Hibernate模块B yyy不兼容,或者甚至像通常一样,spring模块A xxx与spring模块B yyy不兼容。

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

我希望使用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>

谢谢

马蒂

我发现具有挑战性的一件事是确定每个软件包中的内容,尤其是Spring中的内容。

为此,我发现Netbeans对maven的支持非常出色,因为它可以使您知道每种需求都引入了哪些库。 6.7 Beta包含出色的图形树,而m2eclipse也具有非常好的图形依赖树。 您还怎么知道spring-orm包括spring-beans,spring-core,spring-context和spring-tx? 您可以从命令行使用依赖性插件向maven询问依赖性,但是图形表示非常方便。 依赖:树是您要运行的目标。 显然,您也可以从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。

我将从您的“最大”组件开始,然后开始查看已经包含的部分,仅添加缺少的部分。 即使如此,请仔细检查您是否没有重复的依赖项,如果需要,请按照此问题的答案所示排除重复项。

如果您使用的是eclipse,则应在http://m2eclipse.sonatype.org/上从sonatype下载maven插件。

这带有有用的图形化可视化依赖关系(特别是传递性依赖关系 -您尚未在POM中明确定义的依赖关系),并且还显示了相互冲突的依赖关系。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM