maven 传递依赖

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaomin1991222/article/details/84709078
依赖范围影响传递性依赖(左边第一行标示第一直接依赖范围,对上面第一行标示第二直接依赖范围,中间的交叉单元格标示传递性依赖范围)
  compile test provided runtime

compile

compile

---

---

runtime

test

test

---

---

test

provided

provided

---

provided

provided

runtime

runtime

---

---

runtime

  • 当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。
  • 当第二直接依赖的范围是test的时候,依赖不会得以传递。
  • 当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为 provided;
  • 当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime;

 A-->C B-->A ==>B-->C(这种依赖是基于compile这个范围进行传递)

     在dependency配置中如果没有写scope默认就是compile范围,依赖的传递主要是针对compile作用域

     依赖的范围:

         test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖

         compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去

         provided范围指的是在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突

        runtime在运行的时候依赖,在编译的时候不依赖

     依赖冲突

     1、如果a依赖于b的1.0版本,c依赖于b的1.1版本,d依赖于a和c,这时在d的pom中哪一个依赖先写就使用先写依赖的版本

     2、如果a依赖于b的1.0版本,c依赖于b的1.1版本,d依赖于a和c,f依赖于d和c,依赖的路径的长短不一致就选择最小的

    3、如果希望精确的控制依赖包,可以使用依赖的排除功能——>exclusions来排除

 

传递依赖是maven最有特色的、最为方便的优点之一,可以省了很多配置。如a 依赖 b,b 依赖c  默认 a也会依赖 c。但 也会带来隐患,如版本冲突。当然maven也考虑到解决办法,可以使用exclusions来排除相应的重复依赖。

但是我们还会遇到一个严重的问题,那就是,我怎么知道是哪个包的传递依赖产生的冲突 ?那该怎么办呢?当然,maven也会有相应的解决方案。

 首先,你要在pom.xml中加上maven-project-info-reports-plugin插件。

<reporting>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>
     maven-project-info-reports-plugin
    </artifactId>
   </plugin>
 </reporting>

 然后再执行:mvn project-info-reports:dependencies 。生成项目依赖的报表,这样你就能够在报表中找出你版本冲突的相关性依赖了。

最后在相应的dependency中加上exclusions来排除相关的传递依赖。

例:

              <dependency>
                        <groupId>jaxen</groupId>
                        <artifactId>jaxen</artifactId>
                        <version>1.1.1</version>
                        <exclusions>
                                <exclusion>
                                        <groupId>com.ibm.icu</groupId>
                                        <artifactId>icu4j</artifactId>
                                </exclusion>
                        </exclusions>
                        <scope>runtime</scope>
                </dependency>

 

展开阅读全文

没有更多推荐了,返回首页