总体应用我正在使用Apache HttpComponents
依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
但是另一个库使用了这个工件,但是版本不同(4.3.2,而不是4.5.2):
<dependency>
<groupId>com.sendgrid</groupId>
<artifactId>sendgrid-java</artifactId>
</dependency>
问题是此版本之间的API已更改,我收到此错误:
Caused by: java.lang.ClassNotFoundException: org.apache.http.ssl.SSLContexts
我怎么能说maven不要用4.5.2覆盖Sendgrid的HttpComponents(4.3.2)版本?
编辑:httpcomponents
的版本在父pom的dependencyManagement
部分中指定
答案 0 :(得分:1)
给出以下父pom.xml
部分:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.sendgrid</groupId>
<artifactId>sendgrid-java</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
确实在模块中 - 依赖树如下,执行:
mvn dependency:tree
我们得到了输出的一部分:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ module-a ---
[INFO] com.sample:module-a:jar:0.0.1-SNAPSHOT
[INFO] \- com.sendgrid:sendgrid-java:jar:2.0.0:compile
[INFO] +- org.json:json:jar:20140107:compile
[INFO] +- org.apache.httpcomponents:httpcore:jar:4.3.2:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
[INFO] | +- commons-logging:commons-logging:jar:1.2:compile
[INFO] | \- commons-codec:commons-codec:jar:1.9:compile
[INFO] +- com.sendgrid:smtpapi-java:jar:1.0.0:compile
[INFO] \- org.apache.httpcomponents:httpmime:jar:4.3.4:compile
注意:
org.apache.httpcomponents:httpclient:jar:4.5.2:compile
org.apache.httpcomponents:httpcore:jar:4.3.2:compile
然后将以下内容添加到模块-a的pom.xml
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.2</version>
</dependency>
</dependencies>
</dependencyManagement>
重新运行我们的依赖树执行,我们得到输出的一部分:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ module-a ---
[INFO] com.sample:module-a:jar:0.0.1-SNAPSHOT
[INFO] \- com.sendgrid:sendgrid-java:jar:2.0.0:compile
[INFO] +- org.json:json:jar:20140107:compile
[INFO] +- org.apache.httpcomponents:httpcore:jar:4.3.2:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.3.2:compile
[INFO] | +- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] | \- commons-codec:commons-codec:jar:1.6:compile
[INFO] +- com.sendgrid:smtpapi-java:jar:1.0.0:compile
[INFO] \- org.apache.httpcomponents:httpmime:jar:4.3.4:compile
我们现在将httpcore
和httpclient
与我们想要的版本对齐。
另请注意httpmime
到版本4.3.4
,这是修正版本的更改,但仍然是错位(尽管应该是无害的)。
在这种情况下,您似乎在dependencyManagement
(好的方法)中在父级别添加治理,但是在其中一个模块的级别上您需要覆盖它。这种情况可能会发生,但最好是对其进行适当评论,维护以及将来自己在将来看待它。
另请注意:此项目中的其他模块不会受此更改影响,也就是说,它们仍会获得版本4.5.2
。例如,如果整个多模块构建的最终结果是ear
或war
文件,请仔细检查最终得到的内容。
答案 1 :(得分:0)
在简单的maven项目中,在类路径中不可能有相同工件的2个不同版本。因此,您不能同时在类路径中使用4.3.2和4.5.2版本。
但是有几种选择......你可以