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了,嗯,的确有点吃着没事找事做的感觉