1. Maven
- Maven 是一个 Java 项目管理和构建工具
- 约定优于配置
- POM(Project ObjectModel,项目对象模型)
- Maven 生命周期
- Maven 依赖管理
- Maven 插件
1.1 Maven 坐标
- groupId: 隶属的实际项目-公司名
- artifactId: Unique ID,项目里的一个模块
- version: 1.0-SNAPSHOT
- groupId, artifactId, version 唯一定位一个项目
-
groupId:artifactId:version
即com.mycompany.helloworld:helloworld:1.0-SNAPSHOT
- 在 Maven 中声明一个依赖项可以自动下载并导入 classpath
1.2 生命周期
- Lifecycle, Phase, Goal
- Maven 的生命周期(lifecyle)由一系列阶段(phase)构成,每个阶段(phase)会挂接一到多个 Goal
- 执行一个 phase 实际上是执行了一系列 phase, 直到该 phase 为止
- 每执行一个Phase, 都会执行该 Phase 绑定的若干 Goal
- Goal 是最小执行任务单元
- clean > validate > compile > test > package > verify > install > deploy
- 常用命令
- mvn package 不会把依赖的包打到项目中
- mvn install 安装到本地仓库
Phase | 对应的Goal |
---|---|
compile | compiler:compile |
test | compiler:testCompile surefile:test |
1.3 Maven项目的标准结构
/src/main/java
/src/main/resources
/src/test/java
/src/test/java/resources
/target
/target/classes
/pom.xml
2. Maven 依赖管理
2.1 依赖传递
Maven 的依赖传递机制:POM 中只需定义其直接依赖,不必定义任何间接依赖
2.2 Maven 依赖范围
scope | 编译 | 测试 | 运行 | 打包(jar) | 适用场景 |
---|---|---|---|---|---|
compile | Y | Y | Y | jar | default |
provided | Y | Y | 编译时需要依赖 servlet-api.jar,但是在运行时不需要该 jar 包 | ||
runtime | Y | jar | JDBC驱动不参与编译,但在运行时需要具体的第三方实现的 jar | ||
test | Y | ||||
system | Y | Y | 作用范围与 provided 一致,从本地 Jar 中获取依赖 |
2.3 可选依赖
- optional 表示可选依赖,用来控制当前依赖是否向下传递成为间接依赖;
- optional 默认值为 false,表示可以向下传递;
-
optional:true
不会传递依赖,子项目中将不会包含这个依赖
<dependency>
<optional>true</optional>
</dependency>
2.4 排除依赖 VS 可选依赖
- 都能排出依赖,但两者实现机制不一样
- 不同点
- 排除依赖是控制当前项目是否使用其直接依赖传递下来的接间依赖;
- 可选依赖是控制当前项目的依赖是否向下传递;
- 可选依赖的优先级高于排除依赖;
- 若对于同一个间接依赖同时使用排除依赖和可选依赖进行设置,那么可选依赖的取值必须为 false,否则排除依赖无法生效。
3. 依赖冲突与解决
- 依赖调解原则
- 先声明者优先
- 引入路径短者优先
- 排除依赖
- 锁定版本
3.1 依赖调解原则
- 第一声明者优先原则
- 根据坐标导入顺序,以先声明的为准
- 路径近者优先原则
- 直接依赖优先于间接依赖
- 例如:A 依赖 B,如果直接把 B 写入项目的 pom.xml 中,此时 B 要比其它依赖传递过来的路径要近
3.2 依赖排除
- 使用 exclusions 排包
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
3.3 版本锁定
采用直接锁定版本的方法确定依赖 jar 包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径。以锁定的版本为准添加到工程中
版本锁定的使用方式:
第一步:在 <dependencyManagement> 中锁定依赖的版本
第二步:在 <dependencies> 中声明需要导入的 maven 坐标
使用 <dependencyManagement> 并不会将 Jar 导入到项目中,只是对这些 jar 的版本进行锁定,然后项目中通过 <dependencies> 来声明要使用的 jar
4. Maven 仓库
本地仓库从中央仓库下载依赖
4.1 Maven 私服
本地仓库 --> 私有仓库 --> 中央仓库
私有仓库是在公司局域网内,本地仓库从私有仓库下载依赖,若要下载的依赖私有仓库没有,则私有仓库会从中央仓库下载
5. settings.xml
<localRepository>F:\JavaCodes\repository</localRepository>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
网友评论