Maven入门实战笔记03-坐标和依赖

 

坐标

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)