坐标和依赖
何为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的传递性依赖
自动引入
依赖的范围如何传递?
依赖调解
依赖调解的提出为了解决问题:
- A->B->C->X(1.0)、A->D->X(2.0),那个X会被使用?第一原则:路径最近优先
- A->B->Y(1.0)、A->C->Y(2.0),那个Y会被使用?第二原则:先声明优先