我对Java& maven,所以为了了解我的方式,我决定做一个项目作为学习的手段。
我选择了一个很常见的堆栈:
到目前为止,我遇到的最大问题之一是获得正确的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>
由于
玛蒂
答案 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中明确定义的依赖关系),并且还显示了冲突的依赖关系。
更新:根据以下评论,您的里程可能会有所不同。