1.坐标,就是构件(各种jar包)的地址
2.坐标元素:
groupId:定义当前Maven项目隶属的实际项目,类似于java的包名,如com.iteye.ln-ydc.mvndemo(com.iteye.ln-ydc是组织名,mvndemo是实际项目名)
artifactId:定义实际项目中的一个Maven项目(模块)
version:定义Maven项目当前所处的版本
packaging:定义Maven项目的打包方式,默认为jar
classifier:帮助定义构建输出的一些附属构件
注:1.groupId、artifactId、version必须定义,packaging可选,classifier不能直接定义
2.项目构件的文件名是与坐标相对应的,一般规则:artifactId-version[-classifier].packaging
-------------------------------------------------------------------------
1.依赖范围
compile:编译
test:测试
provided:已提供依赖范围(对编译和测试classpath有效)
runtime:运行时
system:系统
import:导入
2.依赖范围与classpath的关系
| 依赖范围(scope) | 编译 | 测试 | 运行 | 例子 |
| compile | Y | Y | Y | spring-core |
| test | - | Y | - | JUnit |
| provided | Y | Y | - | servlet-api |
| runtime | - | Y | Y | jdbc driver |
| system | Y | Y | - | 本地的 |
3.传递性依赖
A依赖B,B依赖C,A与B的依赖关系为传递性依赖
4.传递性依赖和依赖范围
A对B的依赖为第一直接依赖范围,B对C的依赖为第二直接依赖范围,A对C的依赖为传递性依赖范围
| compile | test | provided | runtime | |
| compile | compile | - | - | runtime |
| test | test | - | - | test |
| provided | provided | - | provided | provided |
| runtime | runtime | - | - | runtime |
5.依赖调解
原则一:路径近者优先,如A->B-C->X(1.0)、A->D->X(2.0),X(2.0)会被解析使用
原则二:第一声明者优先,依赖路径长度相同,先声明者优先
6.可选依赖
A依赖于B,B依赖于X(可选),B依赖于Y(可选),即A->B,B->X(可选),B->Y(可选)
由于X、Y是可选依赖,依赖将不会得以传递
例如:B有两个特性X和Y,且这两个特性互斥,如B支持MySQL和Oracle两种数据库,因此,当项目A依赖于项目By时,如果实际使用基于MySQL数据库,那么在项目A中就需要显式地声明mysql-connector-java这一依赖
在理想情况下,是不应该使用可选依赖的
使用可选依赖,是某一个项目实现了多个特性
单一职责原则,一个类就该只有一项职责
7.最佳实践
1.排除依赖,不稳定的版本要排除,声明稳定的版本
2.归类依赖,对于一类依赖的版本进行统一定义
3.优化依赖,以下命令参考Maven入门实战笔记02中的相关命令
mvn dependency:list mvn dependency:tree mvn dependency:analyze
used undeclared dependencies ,项目中使用到,但是没有显式声明的依赖,这种依赖存在潜在的风险
显式声明 任何项目中直接用到的依赖
unused declared dependencies,项目中未使用的,但是显式声明的依赖,对这一类依赖,应仔细分析
本文介绍了Maven坐标系统的组成部分,包括groupId、artifactId、version等,并详细解释了依赖范围及其与classpath的关系。此外,还探讨了依赖传递性、依赖调解原则及可选依赖的概念。
1114

被折叠的 条评论
为什么被折叠?



