maven系列:maven依赖讲解

maven的一大亮点就是依赖,看一下pom.xml文件,如

 <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
     <scope>test</scope>
</dependency>

一)如何找依赖呢1)去对应的官网,比如es的依赖去他们的官网是可以看到的
2)有一些小的东西,比如log4j,junit等,可以去https://mvnrepository.com/,然后在查询框输入关键字就能找到


二)三要素

确定依赖通过三要素groupId、artifactId、version

三)依赖范围
眼尖的同学看到上面的依赖还有个scope标签,这个是复杂依赖范围的,会导致那个依赖包可能在编译、测试或者打包运行的时候,有时候可以使用,有时候不能够使用,共有如下几个值compile,test,provided,runtime

①compile:默认,对编译、测试和运行的classpath都有效。一般都是用这种scope

②test:运行测试代码的classpath有效,编译或者运行主代码的时候无效,仅仅测试代码需要用的依赖一般都会设置为这个范围,比如junit。一些测试框架,或者只有在测试代码中才会使用的一些依赖,会设置为test,这个的好处在于说,打包的时候这种test scope的依是不会放到最终的发布包里去的。减少发布包的体积。

③provided:编译和测试的时候有效,但是在运行的时候无效,因为可能环境已经提供了,比如servlet-api,一般就是这个范围,在运行的时候,servlet容器会提供依赖。servlet-api是用来开发java web项目的,可能你在开发代码和执行单元测试的时候,需要在pom.xml里面声明这个servlet-api的依赖,因为要写代码和测试代码。但是最终打完包之后,放到tomcat容器里面去跑的时候,是不需要将这个servlet-api的依赖包打入发布包中的,因为tomcat容器本身就会给你提供servlet-api的包。

④runtime:测试和运行classpath有效,但是编译代码时无效,比如jdbc的驱动实现类,比如mysql驱动。因为写代码的时候是基于javax.sql包下的标准接口去写代码的。然后在测试的时候需要用这个包,在实际运行的时候才需要用这个包的,但是编译的时候只要javax.sql接口就可以了,不需要mysql驱动类。一般我们声明mysql驱动的时候,不会设置为runtime,因为也许你开发代码的时候会用到mysql驱动特定的api接口,不仅仅只是用javax.sql。

四)依赖传递
比如我们依赖了junit,junit依赖了A,A又依赖了B,其中对junit的依赖范围是test,junit对A的依赖范围是compile,那么我们对A的依赖范围是test

 

  
  
  

compile

  
  

test

  
  

provided

  
  

runtime

  
  

compile

  
  

compile

  
  
  
  
  
  

runtime

  
  

test

  
  

test

  
  
  
  
  
  

test

  
  

provided

  
  

provided

  
  
  
  

provided

  
  

provided

  
  

runtime

  
  

runtime

  
  
  
  
  
  

runtime

  



五)依赖调节
假如依赖链是 A-》B-》C-》D(2.X),这个时候D是2.X版本,通过存在,A-》E-》D(3.X),这个时候的D是3.X版本,那么对于A,选哪一个依赖呢,在maven中有个依赖调节机制,就近原则和优先声明原则,前面说的第二个链路中A和D最近,那么就会自动选3.X版本,如果两个链路长度一样,就选在pom.xml中优先声明的那个

六)可选依赖
可选依赖是什么呢,先来看一下标签:<optional>true</optional>
如果有依赖链路是A-》E-》D(3.X),这个时候如果E-》D依赖的时候选用了上面的标签和对应的值,那么A就依赖不了D了,嗯,的确有点吃着没事找事做的感觉

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值