第四节:Maven坐标和依赖(下)

依赖调解:
     Maven引入的传递性依赖性质,大大简化了我们需要声明的依赖,但也会带来问题,例如:
项目A有这样的依赖关系:A -> B -> C -> X(1.0) , A -> D -> X(2.0),我们可以看到X是A的传递性依赖,但是两个依赖路径上有两个版本的X,这里可能会出现这样一个问题:我们需要调用X中的某一个方法Method(),但是两个版本的X中的Method方法的不一样,那我们调用的时候只是引入了X的声明,但是不知道是要调用哪个版本里的Method方法。所以Maven只会解析一个版本的X,那到底解析哪个呢?
     Maven依赖调解的第一原则:路径最近者优先。
     例如在上例中:A到X(1.0)的路径是3, A到X(2.0)的路径是2,则X(2.0)会被Maven解析。
     但是,如果遇到路径一样长的情况,则需要另一个原则:
     Maven依赖调解的第二原则:第一声明者优先。
     即在路径一样长的情况下,POM中最先被声明的依赖会被Maven解析。


可选依赖:
         定义:当一个项目不适合分割成多个子模块的时候,我们可以使用可选依赖。它的思想在于某些依赖只应用于某些功能,而且当没有该功能时也不存在该依赖。理想状况下,一个功能可能被划分为一个子模块,该子模块是一个只有核心功能的项目,由于当你要使用这个子工程的功能的时候,你会需要它的全部,所以这个子工程只含有非可选性依赖。 然而,如果工程不可被分割,这些依赖被声明为可选。如果一个用户想要使用和可选性依赖相关的功能,他们必须要在工程中重新声明可选性依赖。用一对标签<optional>true</optional>表示。
       应用场景当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖。举例来说,一个类似hibernate的项目,它支持对mysql、oracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。
      可选依赖不会得到传递:就是说项目B的两个可选依赖X与Y不会传递给项目A,他只会对项目B产生影响,当项目A需要使用对项目X的依赖时,需要在POM文件中显示得声明。

排除依赖:
     定义显式的声明我们 不需要的某个 依赖
     应用场景
  • 我们的项目A依赖于构件B,而构件B依赖于另一个构件C的SNAPSHOT(快照)版本,此时构件C就成为了一个传递性依赖,但是SNAPSHOT版本是不稳定的,会对项目A造成影响,所以我们就需要排除掉这个依赖,然后在项目A中显式得声明我们需要的构件C的某个正式版本。
  • 我们的项目A依赖于构件B,但是由于某些原因,该构件不在中央仓库中,我们就需要排除掉这个依赖,然后找到一个替代的构件显式得声明他。
     使用exclusions元素声明排除依赖,exclusions中可以包含一个或多个exclusion的子元素,因此可以排除一个或多个依赖。需要注意的是,在声明excliuison元素时,只需要groupid和artifactId,而不需要version元素,因为可加载到类路径的依赖中,不会出现groupid和artifactId相同,而version不同的情况,所以只需要groupie和artifactId就可以唯一定位某个依赖。而我们再声明我们需要的构件时,需要加上version元素。



归类依赖:
      定义:对于版本号相同的依赖统一管理的方式。
     例子:比如我们有好几个对Spring Framework框架的依赖。它们分别是org.springframework:spring-core:2.5.6,org.springframework:spring-beans:2.5.6,它们是来自同一个项目的不同模块。当我们需要升级框架版本时,这些依赖均需一起升级,所以我们可以定义一个版本属性,下面相关依赖均引用这个属性。
      写法:在POM.xml文件中使用properties元素定义Maven属性,然后定义一个XX子元素.然后我们在需要用到版本号的时候,我们使用{xx}来代替。

优化依赖:
     我们可以使用 mvn dependency:analyze来分析依赖树。
     我们需要注意的两个方面:
  • Used undeclared dependencies:这里是指在项目中用到了,但是没有显式声明的依赖。例如在代码中使用了import声明的依赖类库A,但是这个依赖A是通过直接依赖B传递进来的,当我们升级直接依赖B时,此传递性依赖A也会隐式得发生改变,可能原版我们依赖A编写的某些接口就无法使用了,这会造成编译失败,然后因为这个依赖是隐式的,是隐藏落在很多直接依赖后面的,所以这种错误很难定位到,因此,我们显式声明项目任何项目中直接用到的(import进来的)依赖。
  • Unused declared dependencies:这里是指项目中未使用到,但是显式声明的依赖。但是对于这类依赖不能简单的直接删除其声明,因为mvn dependency:analyze只会分析编译主代码和测试代码时用到的依赖,一些执行测试和运行时需要的依赖它就发现不了,因此,我们需要仔细测试才能删除报Unused declared dependencies的依赖。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值