在哪儿找

  1. 如果我们需要依赖log4j,那么最简单的方法就是百度 搜 maven log4j

image.png

  1. 点击第一个,选择你需要的版本

image.png

  1. 点击版本号,下面就是log4j的坐标

image.png

坐标要素

  1. 其中一个比较完整的dependency如下所示,最常用的就是groupId + artifactId + version,这三个就可以唯一确定一个依赖包了

    1. <dependency>
    2. <groupId></groupId>
    3. <artifactId></artifactId>
    4. <version></version>
    5. <type></type>
    6. <scope></scope>
    7. <optional></optional>
    8. </dependency>

    依赖范围

  2. 依赖范围标签:


  1. maven有三套classpath,classpath就是项目中用到的各种依赖的类,jvm在运行的时候需要去classpath下面加载对应的类,依赖范围就是用来控制依赖包与这三种classpath的关系的
    1. 编译源代码的时候有一套classpath
    2. 编译测试代码以及执行测试代码的时候有一套classpath
    3. 运行项目的时候,有一套classpath


  1. 简单来说,不同的依赖范围,会导致那个依赖包可能在编译、测试或者打包运行的时候,有时候可以使用,有时候不能够使用 | 依赖范围 | 作用 | | :—-: | :—-: | | 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 |

依赖传递

  1. 在没有maven的时候,都是手动直接放一大堆jar包。先找一堆spring的jar包,然后尝试运行,发现报错,说缺失某某类,再去找那个项目的jar包,加进来,又说缺失某某类,循环往复


  1. maven的传递性依赖,就是会自动递归解析所有的依赖,然后负责将依赖下载下来,接着所有层级的依赖,都会成为我们的项目的依赖,不需要我们手工干预


  1. 但是现在又有一个问题,就是对于传递性依赖的依赖范围该怎么办?就是我们对junit的依赖范围是test,junit对A的依赖范围是compile,那么我们对A的依赖范围是什么呢?

image.png

  1. 传递性依赖机制对依赖范围影响如下面的表格,第一列是一级依赖,第一行是二级依赖 | | compile | test | provided | runtime | | —- | —- | —- | —- | —- | | compile | compile | | | runtime | | test | test | | | test | | provided | provided | | provided | provided | | runtime | runtime | | | runtime |

依赖调节

  1. 依赖调节主要是解决依赖冲突的问题,比如A->B->C->X(1.0),A->D->X(2.0),A有两个传递性依赖X,不同的版本

image.png

  1. 就近原则:选用离A最近的,就是X的2.0版本


  1. 第一声明原则:如果路径等长,哪个依赖在pom.xml里先声明,就用哪个


可选依赖

  1. 可选依赖标签:true

  2. 打个比方,如果A依赖于B,B依赖于C,B对C的依赖是optional,那么A就不会依赖于C。反之,如果没有optional,根据传递性依赖机制,A会依赖于C


  1. 可选依赖的主要作用就是,依赖的包不向上传递