forked from CyC2018/CS-Notes
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path構建工具.md
152 lines (96 loc) · 5.35 KB
/
構建工具.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<!-- GFM-TOC -->
* [一、構建工具的作用](#一構建工具的作用)
* [二、Java 主流構建工具](#二java-主流構建工具)
* [三、Maven](#三maven)
* [參考資料](#參考資料)
<!-- GFM-TOC -->
# 一、構建工具的作用
構建工具是用於構建項目的自動化工具,主要包含以下工作:
## 依賴管理
不再需要手動導入 Jar 依賴包,並且可以自動處理依賴關係,也就是說某個依賴如果依賴於其它依賴,構建工具可以幫助我們自動處理這種依賴關係。
## 運行單元測試
不再需要在項目代碼中添加測試代碼,從而避免了汙染項目代碼。
## 將源代碼轉化為可執行文件
包含預處理、編譯、彙編、鏈接等步驟。
## 將可執行文件進行打包
不再需要使用 IDE 將應用程序打包成 Jar 包。
## 發佈到生產服務器上
不再需要通過 FTP 將 Jar 包上傳到服務器上。
# 二、Java 主流構建工具
Ant 具有編譯、測試和打包功能,其後出現的 Maven 在 Ant 的功能基礎上又新增了依賴管理功能,而最新的 Gradle 又在 Maven 的功能基礎上新增了對 Groovy 語言的支持。
<div align="center"> <img src="pics/34751bd9-e8e4-4c20-94bc-f7217049fada.png" width="450px"> </div><br>
Gradle 和 Maven 的區別是,它使用 Groovy 這種特定領域語言(DSL)來管理構建腳本,而不再使用 XML 這種標記性語言。因為項目如果龐大的話,XML 很容易就變得臃腫。
例如要在項目中引入 Junit,Maven 的代碼如下:
```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"
}
```
# 三、Maven
## 概述
提供了項目對象模型(POM)文件來管理項目的構建。
## 倉庫
倉庫的搜索順序為:本地倉庫、中央倉庫、遠程倉庫。
- 本地倉庫用來存儲項目的依賴庫;
- 中央倉庫是下載依賴庫的默認位置;
- 遠程倉庫,因為並非所有的依賴庫都在中央倉庫,或者中央倉庫訪問速度很慢,遠程倉庫是中央倉庫的補充。
## POM
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] 稱為一個項目的座標,其中 groupId、artifactId、version 必須定義,packaging 可選(默認為 Jar),classifier 不能直接定義的,需要結合插件使用。
- groupId:項目組 Id,必須全球唯一;
- artifactId:項目 Id,即項目名;
- version:項目版本;
- packaging:項目打包方式。
## 依賴原則
### 1. 依賴路徑最短優先原則
```html
A -> B -> C -> X(1.0)
A -> D -> X(2.0)
```
由於 X(2.0) 路徑最短,所以使用 X(2.0)。
### 2. 聲明順序優先原則
```html
A -> B -> X(1.0)
A -> C -> X(2.0)
```
在 POM 中最先聲明的優先,上面的兩個依賴如果先聲明 B,那麼最後使用 X(1.0)。
### 3. 覆寫優先原則
子 POM 內聲明的依賴優先於父 POM 中聲明的依賴。
## 解決依賴衝突
找到 Maven 加載的 Jar 包版本,使用 `mvn dependency:tree` 查看依賴樹,根據依賴原則來調整依賴在 POM 文件的聲明順序。
# 參考資料
- [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)
# 微信公眾號
更多精彩內容將發佈在微信公眾號 CyC2018 上,你也可以在公眾號後臺和我交流學習和求職相關的問題。另外,公眾號提供了該項目的 PDF 等離線閱讀版本,後臺回覆 "下載" 即可領取。公眾號也提供了一份技術面試複習大綱,不僅系統整理了面試知識點,而且標註了各個知識點的重要程度,從而幫你理清多而雜的面試知識點,後臺回覆 "大綱" 即可領取。我基本是按照這個大綱來進行復習的,對我拿到了 BAT 頭條等 Offer 起到很大的幫助。你們完全可以和我一樣根據大綱上列的知識點來進行復習,就不用看很多不重要的內容,也可以知道哪些內容很重要從而多安排一些複習時間。
<br><div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/other/公眾號海報6.png"></img></div>