Maven依赖的可传递性

来源:互联网 发布:企业注册域名 编辑:程序博客网 时间:2024/05/21 21:02

  今天我们来讲一讲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 Project有多个下层的Maven Project时,若下层的Maven Project有对一个相同的jar包引用只是版本不同,那么这个上层的Maven Project间接引用哪一个版本的jar包呢?Maven内置采用就近原则,就近的意思是,当前这个Maven Project到需要被引用的jar包之间经历了几层的引用关系,层数越少说明离得越近,则采用层数少的jar进行引用;当相同层数时,那么Maven采用在当前Maven Project当中配置的dependency的顺序进行引用。但是需要注意的是,如果当前Maven对这个相同的jar进行了直接的引用,那么就不会去寻找间接的引用的jar了

  6.统一管理jar的版本号

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

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

原创粉丝点击