03坐标和依赖

坐标和依赖

何为Maven坐标

世界上任何一个构件都可以使用maven坐标唯一标识,maven坐标的元素包括groupId,artifactId,version,packaging,classifier。现在,只要我们提供正确的坐标元素,maven就能找到对应的构件。

坐标详解

  • groupId:定义当前这个maven项目录属的实际项目,表示方式通常与域名反向相对应。
  • artifactId:定义实际项目中的一个maven项目,推荐做法使用实际项目名称作为artifactId的前缀。maven生成的构件,其文件名会以artifactId作为开头。
  • version:定义maven项目当前所处的版本。
  • packaging:定义maven项目的打包方式,如果不定义packaging,默认使用jar。
  • classifier:帮助定义构建输出的一些附属构件。不能直接定义classifier。

实际项目和Maven项目是什么关系?

一个公司(组织)下可以由很多个实际项目,而一个实际项目可以分成多个模块,因此artifactId用来定义一个maven项目,也就是一个模块

依赖范围

程序编译,测试,运行阶段所需要的依赖是有区别的,比如测试所需要的依赖在运行时就不需要,那么这部分空间就可以被节约,Maven针对程序编译,测试,运行阶段所需要的依赖不同而自动引入到不同的classpath(classpath是应用加载器的扫描路径,也就是类加载的路径范围)

设置依赖范围的元素是

  • compile:编译依赖范围,使用此依赖范围对于编译、测试、运行三种classpath都有效,即在编译、测试和运行时都要使用该依赖jar包;
  • test:测试依赖范围,只对测试有效,表明只在测试的时候需要,在编译和运行时将无法使用该类依赖,如 junit;
  • provided:所在的容器运行后已提供的依赖范围。编译和测试有效,运行无效。如servlet-api,在项目运行时,tomcat等容器已经提供,无需Maven重复引入;
  • runtime:运行时依赖范围。测试和运行有效,编译无效。如 jdbc 驱动实现,编译时只需接口,测试或运行时才需要具体的 jdbc 驱动实现;
  • system:系统依赖范围,使用system范围的依赖时必须通过sys03坐标和依赖ath元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用

依赖范围

依赖传递

依赖传递的提出为了解决问题:如果A依赖B,而B依赖C,C需要在A中声明吗?
答案是:C会作为A的传递性依赖自动引入

依赖的范围如何传递?

依赖范围传递

依赖调解

依赖调解的提出为了解决问题:

  1. A->B->C->X(1.0)、A->D->X(2.0),那个X会被使用?第一原则:路径最近优先
  2. A->B->Y(1.0)、A->C->Y(2.0),那个Y会被使用?第二原则:先声明优先

本文标题:03坐标和依赖

文章作者:Sun

发布时间:2020年01月13日 - 10:01

最后更新:2020年01月16日 - 16:01

原始链接:https://sunyi720.github.io/2020/01/13/Maven/03坐标和依赖/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。