From 872c20998733315311b2cbbefbbee131f4c0ca07 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 1 Aug 2018 00:15:26 +0800
Subject: [PATCH] auto commit
---
notes/构建工具.md | 147 ++++++++++++++++++
pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg | Bin 0 -> 20480 bytes
2 files changed, 147 insertions(+)
create mode 100644 notes/构建工具.md
create mode 100644 pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg
diff --git a/notes/构建工具.md b/notes/构建工具.md
new file mode 100644
index 00000000..ae1cac20
--- /dev/null
+++ b/notes/构建工具.md
@@ -0,0 +1,147 @@
+
+* [一、什么是构建工具](#一什么是构建工具)
+* [二、Java 主流构建工具](#二java-主流构建工具)
+* [三、Maven](#三maven)
+
+
+
+# 一、什么是构建工具
+
+构建工具用于构建项目的自动化工具,主要包含以下工作:
+
+## 依赖管理
+
+不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖管理;
+
+## 运行单元测试
+
+不再需要在项目代码中添加测试代码。
+
+## 将源代码转化为可执行文件
+
+包含预处理、编译、汇编、链接等步骤。
+
+## 将可执行文件进行打包
+
+不再需要使用 IDE 将应用程序打包成 Jar 包。
+
+## 发布到生成服务器上
+
+不再需要通过 FTP 将 Jar 包上传到服务器上。
+
+参考资料:
+
+- [What is a build tool?](https://stackoverflow.com/questions/7249871/what-is-a-build-tool)
+
+# 二、Java 主流构建工具
+
+主要包括 Ant、Maven 和 Gradle。
+
+
+
+Gradle 和 Maven 的区别是,它使用 Groovy 这种特定领域语言(DSL)来管理构建脚本,而不再使用 XML 这种标记性语言。因为项目如果庞大的话,XML 很容易就变得臃肿。
+
+例如要在项目中引入 Junit,Maven 的代码如下:
+
+```xml
+
+
+ 4.0.0
+
+ jizg.study.maven.hello
+ hello-first
+ 0.0.1-SNAPSHOT
+
+
+
+ junit
+ junit
+ 4.10
+ test
+
+
+
+```
+
+而 Gradle 只需要几行代码:
+
+```java
+dependencies {
+ testCompile "junit:junit:4.10"
+}
+```
+
+参考资料:
+
+- [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)
+
+# 三、Maven
+
+## 概述
+
+提供了项目对象模型(POM)文件来管理项目的构建。
+
+## 仓库
+
+仓库的搜索顺序为:本地仓库、中央仓库、远程仓库。
+
+- 本地仓库用来存储项目的依赖库;
+- 中央仓库是下载依赖库的默认位置;
+- 远程仓库,因为并非所有的库存储在中央仓库,或者中央仓库访问速度很慢,远程仓库是中央仓库的补充。
+
+## POM
+
+POM 代表项目对象模型,它是一个 XML 文件,保存在项目根目录的 pom.xml 文件中。
+
+```xml
+
+ junit
+ junit
+ 4.12
+ test
+
+```
+
+[groupId, artifactId, version, packaging, classfier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义,packaging 可选(默认为 Jar),classfier 不能直接定义的,需要结合插件使用。
+
+- groupId:项目组 Id,必须全球唯一;
+- artifactId:项目 Id,即项目名;
+- version:项目版本;
+- packaging:项目打包方式。
+
+## 依赖原则
+
+### 依赖路径最短优先原则
+
+```html
+A -> B -> C -> X(1.0)
+A -> D -> X(2.0)
+```
+由于 X(2.0) 路径最短,所以使用 X(2.0)。
+
+### 声明顺序优先原则
+
+```html
+A -> B -> X(1.0)
+A -> C -> X(2.0)
+```
+
+在 POM 中最先声明的优先,上面的两个依赖如果先声明 B,那么最后使用 X(1.0)。
+
+### 覆写优先原则
+
+子 POM 内声明的依赖优先于父 POM 中声明的依赖。
+
+## 解决依赖冲突
+
+找到 Maven 加载的 Jar 包版本,使用 `mvn dependency:tree` 查看依赖树,根据依赖原则来调整依赖在 POM 文件的声明顺序。
+
+参考资料:
+
+- [POM Reference](http://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification)
+
+
+
diff --git a/pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg b/pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e0935e5715e3a6e196b2046bcf0547d4800d4c3f
GIT binary patch
literal 20480
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