CS-Notes/notes/构建工具.md

127 lines
4.5 KiB
Java
Raw Normal View History

2020-11-17 00:32:18 +08:00
# 构建工具
2019-04-25 18:24:51 +08:00
<!-- GFM-TOC -->
2020-11-17 00:32:18 +08:00
* [构建工具](#构建工具)
2020-11-18 03:00:45 +08:00
* [构建工具的作用](#一构建工具的作用)
* [Java 主流构建工具](#二java-主流构建工具)
* [Maven](#三maven)
* [参考资料](#参考资料)
2019-04-25 18:24:51 +08:00
<!-- GFM-TOC -->
2020-11-17 00:32:18 +08:00
## 构建工具的作用
2019-04-25 18:24:51 +08:00
2019-12-08 22:01:39 +08:00
构建一个项目通常包含了依赖管理测试编译打包发布等流程构建工具可以自动化进行这些操作从而为我们减少这些繁琐的工作
2019-04-25 18:24:51 +08:00
2019-12-08 22:01:39 +08:00
其中构建工具提供的依赖管理能够可以自动处理依赖关系例如一个项目需要用到依赖 AA 又依赖于 B那么构建工具就能帮我们导入 B而不需要我们手动去寻找并导入
2019-04-25 18:24:51 +08:00
2019-12-08 22:01:39 +08:00
Java 项目中打包流程通常是将项目打包成 Jar 在没有构建工具的情况下我们需要使用命令行工具或者 IDE 手动打包而发布流程通常是将 Jar 包上传到服务器上
2019-04-25 18:24:51 +08:00
2020-11-17 00:32:18 +08:00
## Java 主流构建工具
2019-04-25 18:24:51 +08:00
2019-07-21 23:21:59 +08:00
Ant 具有编译测试和打包功能其后出现的 Maven Ant 的功能基础上又新增了依赖管理功能而最新的 Gradle 又在 Maven 的功能基础上新增了对 Groovy 语言的支持
2019-04-25 18:24:51 +08:00
2019-12-08 22:01:39 +08:00
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/image-20191208204118932.png"/> </div><br>
2019-04-25 18:24:51 +08:00
Gradle Maven 的区别是它使用 Groovy 这种特定领域语言DSL来管理构建脚本而不再使用 XML 这种标记性语言因为项目如果庞大的话XML 很容易就变得臃肿
例如要在项目中引入 JunitMaven 的代码如下
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jizg.study.maven.hello</groupId>
<artifactId>hello-first</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
```
Gradle 只需要几行代码
```java
dependencies {
testCompile "junit:junit:4.10"
}
```
2020-11-17 00:32:18 +08:00
## Maven
2019-04-25 18:24:51 +08:00
2020-11-17 00:32:18 +08:00
### 概述
2019-04-25 18:24:51 +08:00
提供了项目对象模型POM文件来管理项目的构建
2020-11-17 00:32:18 +08:00
### 仓库
2019-04-25 18:24:51 +08:00
仓库的搜索顺序为本地仓库中央仓库远程仓库
- 本地仓库用来存储项目的依赖库
- 中央仓库是下载依赖库的默认位置
2019-06-09 17:04:10 +08:00
- 远程仓库因为并非所有的依赖库都在中央仓库或者中央仓库访问速度很慢远程仓库是中央仓库的补充
2019-04-25 18:24:51 +08:00
2020-11-17 00:32:18 +08:00
### POM
2019-04-25 18:24:51 +08:00
POM 代表项目对象模型它是一个 XML 文件保存在项目根目录的 pom.xml 文件中
```xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
```
[groupId, artifactId, version, packaging, classifier] 称为一个项目的坐标其中 groupIdartifactIdversion 必须定义packaging 可选默认为 Jarclassifier 不能直接定义的需要结合插件使用
- groupId项目组 Id必须全球唯一
- artifactId项目 Id即项目名
- version项目版本
- packaging项目打包方式
2020-11-17 00:32:18 +08:00
### 依赖原则
2019-04-25 18:24:51 +08:00
2020-11-17 00:32:18 +08:00
#### 1. 依赖路径最短优先原则
2019-04-25 18:24:51 +08:00
```html
A -> B -> C -> X(1.0)
A -> D -> X(2.0)
```
由于 X(2.0) 路径最短所以使用 X(2.0)
2020-11-17 00:32:18 +08:00
#### 2. 声明顺序优先原则
2019-04-25 18:24:51 +08:00
```html
A -> B -> X(1.0)
A -> C -> X(2.0)
```
POM 中最先声明的优先上面的两个依赖如果先声明 B那么最后使用 X(1.0)
2020-11-17 00:32:18 +08:00
#### 3. 覆写优先原则
2019-04-25 18:24:51 +08:00
POM 内声明的依赖优先于父 POM 中声明的依赖
2020-11-17 00:32:18 +08:00
### 解决依赖冲突
2019-04-25 18:24:51 +08:00
找到 Maven 加载的 Jar 包版本使用 `mvn dependency:tree` 查看依赖树根据依赖原则来调整依赖在 POM 文件的声明顺序
2020-11-17 00:32:18 +08:00
## 参考资料
2019-04-25 18:24:51 +08:00
- [POM Reference](http://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification)
- [What is a build tool?](https://stackoverflow.com/questions/7249871/what-is-a-build-tool)
- [Java Build Tools Comparisons: Ant vs Maven vs Gradle](https://programmingmitra.blogspot.com/2016/05/java-build-tools-comparisons-ant-vs.html)
- [maven 2 gradle](http://sagioto.github.io/maven2gradle/)
- [新一代构建工具 gradle](https://www.imooc.com/learn/833)