Skip to content

Commit 872c209

Browse files
committed
auto commit
1 parent ec0f8fe commit 872c209

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed

notes/构建工具.md

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
<!-- GFM-TOC -->
2+
* [一、什么是构建工具](#一什么是构建工具)
3+
* [二、Java 主流构建工具](#二java-主流构建工具)
4+
* [三、Maven](#三maven)
5+
<!-- GFM-TOC -->
6+
7+
8+
# 一、什么是构建工具
9+
10+
构建工具用于构建项目的自动化工具,主要包含以下工作:
11+
12+
## 依赖管理
13+
14+
不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖管理;
15+
16+
## 运行单元测试
17+
18+
不再需要在项目代码中添加测试代码。
19+
20+
## 将源代码转化为可执行文件
21+
22+
包含预处理、编译、汇编、链接等步骤。
23+
24+
## 将可执行文件进行打包
25+
26+
不再需要使用 IDE 将应用程序打包成 Jar 包。
27+
28+
## 发布到生成服务器上
29+
30+
不再需要通过 FTP 将 Jar 包上传到服务器上。
31+
32+
参考资料:
33+
34+
- [What is a build tool?](https://stackoverflow.com/questions/7249871/what-is-a-build-tool)
35+
36+
# 二、Java 主流构建工具
37+
38+
主要包括 Ant、Maven 和 Gradle。
39+
40+
<div align="center"> <img src="../pics//897503d0-59e3-4752-903d-529fbdb72fee.jpg"/> </div><br>
41+
42+
Gradle 和 Maven 的区别是,它使用 Groovy 这种特定领域语言(DSL)来管理构建脚本,而不再使用 XML 这种标记性语言。因为项目如果庞大的话,XML 很容易就变得臃肿。
43+
44+
例如要在项目中引入 Junit,Maven 的代码如下:
45+
46+
```xml
47+
<?xml version="1.0" encoding="UTF-8"?>
48+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
49+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
50+
<modelVersion>4.0.0</modelVersion>
51+
52+
<groupId>jizg.study.maven.hello</groupId>
53+
<artifactId>hello-first</artifactId>
54+
<version>0.0.1-SNAPSHOT</version>
55+
56+
<dependencies>
57+
<dependency>
58+
<groupId>junit</groupId>
59+
<artifactId>junit</artifactId>
60+
<version>4.10</version>
61+
<scope>test</scope>
62+
</dependency>
63+
</dependencies>
64+
</project>
65+
```
66+
67+
而 Gradle 只需要几行代码:
68+
69+
```java
70+
dependencies {
71+
testCompile "junit:junit:4.10"
72+
}
73+
```
74+
75+
参考资料:
76+
77+
- [Java Build Tools Comparisons: Ant vs Maven vs Gradle](https://programmingmitra.blogspot.com/2016/05/java-build-tools-comparisons-ant-vs.html)
78+
- [maven 2 gradle](http://sagioto.github.io/maven2gradle/)
79+
- [新一代构建工具 gradle](https://www.imooc.com/learn/833)
80+
81+
# 三、Maven
82+
83+
## 概述
84+
85+
提供了项目对象模型(POM)文件来管理项目的构建。
86+
87+
## 仓库
88+
89+
仓库的搜索顺序为:本地仓库、中央仓库、远程仓库。
90+
91+
- 本地仓库用来存储项目的依赖库;
92+
- 中央仓库是下载依赖库的默认位置;
93+
- 远程仓库,因为并非所有的库存储在中央仓库,或者中央仓库访问速度很慢,远程仓库是中央仓库的补充。
94+
95+
## POM
96+
97+
POM 代表项目对象模型,它是一个 XML 文件,保存在项目根目录的 pom.xml 文件中。
98+
99+
```xml
100+
<dependency>
101+
<groupId>junit</groupId>
102+
<artifactId>junit</artifactId>
103+
<version>4.12</version>
104+
<scope>test</scope>
105+
</dependency>
106+
```
107+
108+
[groupId, artifactId, version, packaging, classfier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义,packaging 可选(默认为 Jar),classfier 不能直接定义的,需要结合插件使用。
109+
110+
- groupId:项目组 Id,必须全球唯一;
111+
- artifactId:项目 Id,即项目名;
112+
- version:项目版本;
113+
- packaging:项目打包方式。
114+
115+
## 依赖原则
116+
117+
### 依赖路径最短优先原则
118+
119+
```html
120+
A -> B -> C -> X(1.0)
121+
A -> D -> X(2.0)
122+
```
123+
由于 X(2.0) 路径最短,所以使用 X(2.0)。
124+
125+
### 声明顺序优先原则
126+
127+
```html
128+
A -> B -> X(1.0)
129+
A -> C -> X(2.0)
130+
```
131+
132+
在 POM 中最先声明的优先,上面的两个依赖如果先声明 B,那么最后使用 X(1.0)。
133+
134+
### 覆写优先原则
135+
136+
子 POM 内声明的依赖优先于父 POM 中声明的依赖。
137+
138+
## 解决依赖冲突
139+
140+
找到 Maven 加载的 Jar 包版本,使用 `mvn dependency:tree` 查看依赖树,根据依赖原则来调整依赖在 POM 文件的声明顺序。
141+
142+
参考资料:
143+
144+
- [POM Reference](http://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification)
145+
146+
147+
20 KB
Loading

0 commit comments

Comments
 (0)