Maven重写了传递依赖

时间:2016-06-06 15:11:00

标签: java maven

总体应用我正在使用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部分中指定

2 个答案:

答案 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  

我们现在将httpcorehttpclient与我们想要的版本对齐。

另请注意httpmime到版本4.3.4,这是修正版本的更改,但仍然是错位(尽管应该是无害的)。

在这种情况下,您似乎在dependencyManagement(好的方法)中在父级别添加治理,但是在其中一个模块的级别上您需要覆盖它。这种情况可能会发生,但最好是对其进行适当评论,维护以及将来自己在将来看待它。

另请注意:此项目中的其他模块不会受此更改影响,也就是说,它们仍会获得版本4.5.2。例如,如果整个多模块构建的最终结果是earwar文件,请仔细检查最终得到的内容。

答案 1 :(得分:0)

在简单的maven项目中,在类路径中不可能有相同工件的2个不同版本。因此,您不能同时在类路径中使用4.3.2和4.5.2版本。

但是有几种选择......你可以

  • 在您的项目中使用旧版本(4.3。*),与sendgrid-java依赖(最简单的方式)兼容;或
  • 更新sendgrid-java依赖项,如果较新的与http组件兼容4.5。*(首选方式);或
  • 将sendgrid-java标记为&#39;提供&#39;依赖,在运行时构建一个单独的类加载器并使用正确的依赖版本加载它(有点棘手,但我在几个银行应用程序中看到了这种方法)