今天我们来讲一讲Maven工程在引用jar包上的传递性。

  1.情景分析

  假设有两个Maven工程,A和B,其中A引用了已经安装在仓库中的B工程install成的jar包,而B工程本身有对spring-core.jar的引用。我们可以看到在A工程的Maven Dependencise中,也会有对spring-core.jar的引用。这就是引用依赖的传递性。

  2.依赖传递的好处

  依赖的好处是可传递的依赖不必在每一个模块中都加以引用,最底层引用一次就可以,实际项目工程中,会有一个专门的过程来负责对项目中大多数工程都用到的jar包的管理。

  3.依赖传递的范围

  还有一点需要注意的是,我们讲的依赖的可传递性,仅仅针对compile范围的jar包的引用,是可以在Maven Project之间传递的,而对test、provided范围的依赖是不可以在Maven Project之间传递的。所以,test/provided范围的依赖就需要单独的在每一个需要用到的Maven Project中单独添加,如junit.jar和servlet-api.jar。

  4.依赖传递的排除

  ① 情景分析

  有时我们对某个jar包进行依赖时,会将被依赖jar包的依赖也间接的依赖了,如依赖spring-core.jar,会将commons-loging.jar也给依赖进来,处于某种安全性和稳定性的考虑,我们不希望将这个附带的commons-logging.jar也给引用到当前的Maven Project中,那么我们就需要在pom.xml中间接引入这个commons-logging.jar的地方使用<exclusions><exclusion><groupId><artifactId></artifactId></groupId></exclusion></exclusions>将其剔除。需要注意的是,若是在下层剔除,则上层自动的也不会对下层剔除的内容进行引用,若是在上层剔除,下层依然会引用。

  5.依赖传递的原则

  这个原则的作用是解决多个Maven Project之间的jar包冲突的问题。

,如果当前Maven对这个相同的jar进行了直接的引用,那么就不会去寻找间接的引用的jar了

  6.统一管理jar的版本号

  当一个Maven Project有对一个技术的一系列jar包有引用时,如对spring-*.jar的引用,为了开发中尽量不出问题,我们需要采用jar包相同的版本号。

  我们只需要在pom.xml文件中配置一个properties标签结合我们自定义的标签,然后在dependency标签下的version标签中使用${}对上面的自定义标签进行应用就可以了。

举例:

假如当前项目为A,A依赖于B,B依赖于C。此时称A对于B是第一直接依赖,B对于C是第二直接依赖,而A对于C是传递性依赖。只要知道B在A项目中的scope,就可以知道C在A中的scope。其依赖范围如下:

当C在B中的scope为test时,A不依赖C,C直接被丢弃
当C在B中的scope为provided时,只有当B在A中的scope也是provided时,A才会依赖C,这时候C在A的scope是provided
当C在B中的scope为compile或runtime时,A依赖C,此时C在A中的scope继承自B在A的scope。注意,如果C的scope是runtime,B的scope是compile,此时C在A的scope是runtime,而不是compile