marven系列5-marven坐标与依赖

marven的坐标

Maven世界拥有大量构件,我们需要找一个用来唯一标识一个构件的统一规范
拥有了统一规范,就可以把查找工作交给机器
例如项目所需的Junit依赖,我们只需在pom.xml文件中添加坐标依赖即可,marven会帮我们从仓库中查找

  • groupId:定义当前Maven组织名称
  • artifactId:定义实际项目名称
  • version:定义当前项目的当前版本
  • packaging:项目的打包方式,最为常见的jar和war两种

marven的依赖

就是对项目中jar 包的管理。可以在pom文件中定义jar包的GAV坐标,管理依赖。
依赖声明主要包含如下元素:

<!--添加依赖配置-->
      <dependencies>
          <!--项目要使用到junit的jar包,所以在这里添加junit的jar包的依赖-->
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.9</version>
              <scope>test</scope>
          </dependency>
     </dependencies>

依赖的范围

《marven系列5-marven坐标与依赖》
依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:

1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效

2.test:测试依赖范围。只对于测试classpath有效

3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api

4.runtime:运行时提供。例如:jdbc驱动

直接依赖和间接依赖

如果B中使用A,C中使用B,则称A是B的直接依赖,而称A是C的间接依赖。

C->B->A

C直接依赖B

C间接依赖A
《marven系列5-marven坐标与依赖》

依赖范围对传递依赖的影响

《marven系列5-marven坐标与依赖》

左边第一列表示第一直接依赖范围

上面第一行表示第二直接依赖范围

那什么是第一依赖与第二依赖呢?
假设有这么几个maven项目。A—>B—->C—->D—->E—->F 其中箭头表示引用依赖。
站在A的角度上来说。A和B是第一依赖。B和C是第二依赖。你站在B的角度来说。B和C是第一依赖,C和D是第二依赖。

中间的交叉单元格表示传递性依赖范围。

总结:

  • 当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。
  • 当第二直接依赖的范围是test的时候,依赖不会得以传递。
  • 当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范- 围同样为 provided;
  • 当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime;
  • 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)
  • 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准(就近原则)

可选依赖

true/false 是否可选,也可以理解为是否向下传递。

在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false。
《marven系列5-marven坐标与依赖》

《marven系列5-marven坐标与依赖》

《marven系列5-marven坐标与依赖》
firstfriend项目依赖与first项目,由于first依赖Junit,但是option的值是true,不向下传递,那么在firstfriend中直接使用Junit就会出错,当option的值是false,或者没有option参数时,Junit的依赖会向下传递,friendfriend直接使用Junit不会出错

排除依赖

排除依赖就是在本次依赖中有一些多余的jar包也被传递依赖过来,如果想把这些jar包排除的话可以配置exclusions进行排除。

<exclusions>
    <exclusion>
        <groupId>cn.itcast.maven</groupId>
        <artifactId>maven-first</artifactId>
    </exclusion>
</exclusions>

排除依赖包中所包含的依赖关系,不需要添加版本号。
《marven系列5-marven坐标与依赖》

《marven系列5-marven坐标与依赖》

同上,firstfriend依赖first,first有Junit依赖,可以向下传递,但是firstfriend使用了排除Junit依赖,故直接使用Junit报错

参考Mavn 使用介绍

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注