我在我的模块上运行了maven依赖:树。以下是此输出的摘录。
[INFO] +- org.springframework:spring-webmvc:jar:4.0.2.RELEASE:compile
[INFO] | +- org.springframework:spring-beans:jar:4.0.2.RELEASE:compile
[INFO] | +- org.springframework:spring-expression:jar:4.0.2.RELEASE:compile
[INFO] | \- org.springframework:spring-web:jar:4.0.2.RELEASE:compile
[INFO] +- javax.servlet:javax.servlet-api:jar:3.0.1:provided
[INFO] +- org.apache.httpcomponents:httpcore:jar:4.3.2:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.3.2:compile
[INFO] | \- commons-codec:commons-codec:jar:1.6:compile
[INFO] +- org.apache.commons:commons-lang3:jar:3.2.1:compile
[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.5.0:compile
[INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.5.0:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.5.0:compile
[INFO] +- com.newrelic.agent.java:newrelic-api:jar:3.6.0:compile
我从transitive dependency
看到commons-codec:commons-codec:jar:1.6
到org.apache.httpcomponents:httpclient:jar:4.3.2
。
但我在$M2_HOME/org/apache/httpcomponents/httpclient/4.3.2/httpclient-4.3.2.jar
内找不到这个jar。
我也没有看到这个jar位于'引用的图书馆'或者' maven依赖'在Eclipse中。我的项目Base64Util
来自commons-codec
,它编译得很好。
答案 0 :(得分:1)
依赖关系在POM中定义,如您所见:
http://central.maven.org/maven2/org/apache/httpcomponents/httpclient/4.3.2/httpclient-4.3.2.pom
对commons-codec存在编译依赖性。它有一个父pom引用httpcomponents-client,它将版本定义为1.6,如下所示:
因此maven输出正确并且将提供库。现在,如果您在代码中使用此库中的类,我建议您在pom中使用明确的依赖项。
Maven构建这个依赖关系树以查看需要哪些库,因为每个jar只包含它自己的类而不是依赖项。 Maven将验证,如果多个库询问相同的依赖关系,那么使用的版本将适用于两个库。有时它无法找到解决方案,并且会在依赖性解析错误的情况下将其抛向空中。如果它有库列表,它将下载它们并将它们放在java类路径上进行编译等...
这是必需的,因为普通的java类加载器将所有类放在同一名称空间中。情况并非总是如此,例如servlet容器为每个war创建一个类加载器,osgi容器每个bundle一个,但是所有这些系统都需要付出代价:奇怪的ClassCast异常,因为一个类被加载到多个类加载器中。这就是为什么jar不包含它们在自包含uberjar中的依赖关系。