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 - 如何使用多个版本的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到特定版本的maven依赖项的最低JDK版本?

如何使用不同的分类器在 Ivy 中下载多个 Maven 依赖项?

如何在 Maven 中找出隐藏的依赖项和插件版本?

Maven:如何覆盖库添加的依赖项

如何从maven存储库中清除旧的依赖项?

Maven 依赖项 - 版本与更新