Maven - 如何使用多个版本的依赖项?
Posted
技术标签:
【中文标题】Maven - 如何使用多个版本的依赖项?【英文标题】:Maven - how to work with multiple versions of dependencies? 【发布时间】:2014-12-18 18:11:01 【问题描述】:我有使用 JIRA REST Java 客户端的项目。在我尝试将它与 Spring Boot 集成之前,它运行良好。因为我无法从AsynchronousJiraRestClientFactory
调用createWithBasicHttpAuthentication
而不会出错。我明白了:
ClassNotFoundException: org.apache.http.util.Args
所以我在pom.xml
中添加了HttpComponents Core blocking I/O(httpcore)
依赖项,但之后我得到了
ClassNotFoundException: org.apache.http.nio.NHttpMessageParserFactory
我通过将HttpComponents Core non-blocking I/O(httpcore-nio)
添加到pom.xml
解决了这个问题。现在我有
NoSuchMethodError: org.apache.http.nio.client.HttpAsyncClient.start()V
我比较了 dependency:tree
项目有 spring boot 父级和注释掉的情况。它向我展示了添加 spring boot 父级更改了我的依赖项的版本。您可以检查差异here(左侧没有弹簧靴,右侧有弹簧靴)
JIRA REST Java 客户端似乎需要一些旧版本的依赖项。 我该如何解决这个问题?
pom.xml
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.0.0.RELEASE</version>
</parent>
...
<dependencies>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-rest-java-client-core</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore-nio</artifactId>
<version>4.3</version>
</dependency>
</dependencies>
...
【问题讨论】:
很明显,您使用的是相当旧的库版本。为什么不尝试升级com.atlassian
版本...但是,如果添加您添加的依赖项使其工作,那有什么问题?
没有办法在不同版本中使用相同的依赖项 2 次(如果可能的话,java 会使用什么版本??)您必须找到适合您情况的依赖项版本。
看来你有点命中注定了。 Maven 通过某种距离解决依赖关系。因此,如果您在 pom 中添加正确的版本,则距离为 1,任何传递依赖(相同的 groupId,artifactId)都会有更大的距离。因此,将您的版本的依赖项添加到您的 pom 将始终获胜。但是,如果某些其他依赖项需要更新的版本,那么除了升级之外别无他法。如果最终所有都加载了相同的类加载器,那么您就不能拥有同一类的两个版本。
如果我是你,我会尝试让 Atlassian 更新他们的库的依赖项。不仅它的许多依赖项非常旧(例如,它们使用的是 Spring 2.5.6),从版本号来看,一些似乎也是 Atlassian 的分支:org.apache.httpcomponents:httpclient:jar:4.2.1 -atlassian-2 和 org.apache.httpcomponents:httpasyncclient:jar:4.0-beta3-atlassian-1
这个库很奇怪。来自 Atlassian 的引用标记为:This project is not actively supported by Atlassian, but feel free to contribute to it.
,但文档由 Atlassian 员工管理...
【参考方案1】:
我能够通过覆盖我的 pom.xml 中的这些属性来修复我的 Spring Boot 应用程序中的运行时
<properties>
<httpasyncclient.version>4.0-beta3-atlassian-1</httpasyncclient.version>
<httpclient.version>4.2.1-atlassian-2</httpclient.version>
</properties>
请注意,如果您决定在项目中使用 http-client 和/或 httpassync 客户端(例如使用 RestTemplate),可能会出现其他问题。
Atlassian 绝对应该升级依赖项。
【讨论】:
以上是关于Maven - 如何使用多个版本的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章