我有一个类似这样的依赖结构:
A:compile
com.jolbox:bonecp:jar:0.7.1.RELEASE:compile
com.google.guava:guava:jar:r06:compile
com.google.guava:guava:jar:13.0:compile
也就是我的项目依赖A,它依赖于Guava 13.0和BoneCP(依赖于Guava r06)。
当我跑步时,mvn clean dependency:tree | grep guava
我看到:
[INFO] | | \- com.google.guava:guava:jar:13.0:compile
据我了解,Maven 的依赖解决方案是应该发生的。
但是,当我运行mvn clean package
并解压生成的 jar 时,似乎 Guava r06 已包含在内。在 A 中,我依赖的是 Guava 13.0 中的功能,但不是 r06,所以我遇到了运行时故障(java.lang.NoClassDefFoundError: com/google/common/collect/Table
)。
我正在使用 shade 插件(1.4)来创建包含所有依赖项的 jar。这是mvn --version
(在我们的构建服务器上,我遇到了这个问题)的结果:
Apache Maven 3.0.4 (r1232337; 2012-01-17 08:44:56+0000)
Maven home: /opt/apache/apache-maven-3.0.4
Java version: 1.6.0_26, vendor: Sun Microsystems Inc.
Java home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-5-amd64", arch: "amd64", family: "unix"
在另一台机器(我的本地工作站)上,打包的 jar 包含我预期的 Guava 13.0。该机器上的版本信息是:
/usr/java/default
Apache Maven 2.2.1 (rNON-CANONICAL_2011-06-28_14-50_mockbuild; 2011-06-28 10:50:25-0400)
Java version: 1.6.0_27
Java home: /usr/java/jdk1.6.0_27/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.43.8-1.fc15.x86_64" arch: "amd64" Family: "unix"
从 Maven 2.2.1 到 3.0.4 的变化是否改变了依赖解析策略?这里发生了什么?