构建工具.md 4.6 KB
Newer Older
C
CyC2018 已提交
1 2 3 4 5 6 7 8 9
<!-- GFM-TOC -->
* [一、构建工具的作用](#一构建工具的作用)
* [二、Java 主流构建工具](#二java-主流构建工具)
* [三、Maven](#三maven)
* [参考资料](#参考资料)
<!-- GFM-TOC -->


# 一、构建工具的作用
C
CyC2018 已提交
10

C
CyC2018 已提交
11
构建工具是用于构建项目的自动化工具,主要包含以下工作:
C
CyC2018 已提交
12

C
CyC2018 已提交
13
## 依赖管理
C
CyC2018 已提交
14

C
CyC2018 已提交
15
不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖管理。
C
CyC2018 已提交
16

C
CyC2018 已提交
17
## 运行单元测试
C
CyC2018 已提交
18

C
CyC2018 已提交
19
不再需要在项目代码中添加测试代码,从而避免了污染项目代码。
C
CyC2018 已提交
20

C
CyC2018 已提交
21
## 将源代码转化为可执行文件
C
CyC2018 已提交
22 23 24

包含预处理、编译、汇编、链接等步骤。

C
CyC2018 已提交
25
## 将可执行文件进行打包
C
CyC2018 已提交
26

C
CyC2018 已提交
27
不再需要使用 IDE 将应用程序打包成 Jar 包。
C
CyC2018 已提交
28

C
CyC2018 已提交
29
## 发布到生产服务器上
C
CyC2018 已提交
30

C
CyC2018 已提交
31
不再需要通过 FTP 将 Jar 包上传到服务器上。
C
CyC2018 已提交
32

C
CyC2018 已提交
33
# 二、Java 主流构建工具
C
CyC2018 已提交
34

C
CyC2018 已提交
35
主要包括 Ant、Maven 和 Gradle。
C
CyC2018 已提交
36

C
CyC2018 已提交
37
<div align="center"> <img src="pics/df247180-4d5c-4d4b-ab0f-1aec61d13d45.png"/> </div><br>
C
CyC2018 已提交
38

C
CyC2018 已提交
39
Gradle 和 Maven 的区别是,它使用 Groovy 这种特定领域语言(DSL)来管理构建脚本,而不再使用 XML 这种标记性语言。因为项目如果庞大的话,XML 很容易就变得臃肿。
C
CyC2018 已提交
40

C
CyC2018 已提交
41
例如要在项目中引入 Junit,Maven 的代码如下:
C
CyC2018 已提交
42 43

```xml
C
CyC2018 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
<?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>
C
CyC2018 已提交
61 62 63
</project>
```

C
CyC2018 已提交
64
而 Gradle 只需要几行代码:
C
CyC2018 已提交
65 66

```java
C
CyC2018 已提交
67 68
dependencies {
    testCompile "junit:junit:4.10"
C
CyC2018 已提交
69 70 71
}
```

C
CyC2018 已提交
72
# 三、Maven
C
CyC2018 已提交
73

C
CyC2018 已提交
74
## 概述
C
CyC2018 已提交
75 76 77

提供了项目对象模型(POM)文件来管理项目的构建。

C
CyC2018 已提交
78
## 仓库
C
CyC2018 已提交
79 80 81

仓库的搜索顺序为:本地仓库、中央仓库、远程仓库。

C
CyC2018 已提交
82 83 84
- 本地仓库用来存储项目的依赖库;
- 中央仓库是下载依赖库的默认位置;
- 远程仓库,因为并非所有的库存储在中央仓库,或者中央仓库访问速度很慢,远程仓库是中央仓库的补充。
C
CyC2018 已提交
85

C
CyC2018 已提交
86
## POM
C
CyC2018 已提交
87

C
CyC2018 已提交
88
POM 代表项目对象模型,它是一个 XML 文件,保存在项目根目录的 pom.xml 文件中。
C
CyC2018 已提交
89 90 91

```xml
<dependency>
C
CyC2018 已提交
92 93 94 95
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
C
CyC2018 已提交
96 97 98
</dependency>
```

C
CyC2018 已提交
99
[groupId, artifactId, version, packaging, classifier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义,packaging 可选(默认为 Jar),classifier 不能直接定义的,需要结合插件使用。
C
CyC2018 已提交
100

C
CyC2018 已提交
101

C
CyC2018 已提交
102 103 104 105
- groupId:项目组 Id,必须全球唯一;
- artifactId:项目 Id,即项目名;
- version:项目版本;
- packaging:项目打包方式。
C
CyC2018 已提交
106

C
CyC2018 已提交
107
## 依赖原则
C
CyC2018 已提交
108

C
CyC2018 已提交
109
### 1. 依赖路径最短优先原则
C
CyC2018 已提交
110 111

```html
C
CyC2018 已提交
112 113
A -> B -> C -> X(1.0)
A -> D -> X(2.0)
C
CyC2018 已提交
114
```
C
CyC2018 已提交
115
由于 X(2.0) 路径最短,所以使用 X(2.0)。
C
CyC2018 已提交
116

C
CyC2018 已提交
117
### 2. 声明顺序优先原则
C
CyC2018 已提交
118 119

```html
C
CyC2018 已提交
120 121
A -> B -> X(1.0)
A -> C -> X(2.0)
C
CyC2018 已提交
122 123
```

C
CyC2018 已提交
124
在 POM 中最先声明的优先,上面的两个依赖如果先声明 B,那么最后使用 X(1.0)。
C
CyC2018 已提交
125

C
CyC2018 已提交
126
### 3. 覆写优先原则
C
CyC2018 已提交
127

C
CyC2018 已提交
128
子 POM 内声明的依赖优先于父 POM 中声明的依赖。
C
CyC2018 已提交
129

C
CyC2018 已提交
130
## 解决依赖冲突
C
CyC2018 已提交
131

C
CyC2018 已提交
132
找到 Maven 加载的 Jar 包版本,使用 `mvn dependency:tree` 查看依赖树,根据依赖原则来调整依赖在 POM 文件的声明顺序。
C
CyC2018 已提交
133

C
CyC2018 已提交
134
# 参考资料
C
CyC2018 已提交
135

C
CyC2018 已提交
136 137 138 139 140
- [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)
C
CyC2018 已提交
141

C
CyC2018 已提交
142 143 144 145




C
CyC2018 已提交
146
</br><div align="center">欢迎关注我的公众号 CyC2018,这里有最核心的高频基础知识面试题,后台回复关键字 📚 “资料” 可领取复习大纲 ,帮你理清多而杂的面试知识点。</div></br>
C
CyC2018 已提交
147
<div align="center"><img width="180px" src="https://cyc-1256109796.cos.ap-guangzhou.myqcloud.com/%E5%85%AC%E4%BC%97%E5%8F%B7.jpg"></img></div>