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

134 lines
4.3 KiB
Markdown
Raw Normal View History

2019-03-08 21:39:27 +08:00
# 一、构建工具的作用
2018-08-01 00:15:26 +08:00
2018-08-01 00:20:53 +08:00
构建工具是用于构建项目的自动化工具,主要包含以下工作:
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## 依赖管理
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
不再需要手动导入 Jar 依赖包并且可以自动处理依赖关系也就是说某个依赖如果依赖于其它依赖构建工具可以帮助我们自动处理这种依赖管理。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## 运行单元测试
2018-08-01 00:15:26 +08:00
2018-08-25 23:12:21 +08:00
不再需要在项目代码中添加测试代码,从而避免了污染项目代码。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## 将源代码转化为可执行文件
2018-08-01 00:15:26 +08:00
包含预处理、编译、汇编、链接等步骤。
2019-03-08 21:39:27 +08:00
## 将可执行文件进行打包
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
不再需要使用 IDE 将应用程序打包成 Jar 包。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## 发布到生产服务器上
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
不再需要通过 FTP  Jar 包上传到服务器上。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
# 二、Java 主流构建工具
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
主要包括 Ant、Maven  Gradle。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
![](index_files/df247180-4d5c-4d4b-ab0f-1aec61d13d45.png)
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
Gradle  Maven 的区别是它使用 Groovy 这种特定领域语言DSL来管理构建脚本而不再使用 XML 这种标记性语言。因为项目如果庞大的话XML 很容易就变得臃肿。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
例如要在项目中引入 JunitMaven 的代码如下
2018-08-01 00:15:26 +08:00
```xml
2019-03-08 21:39:27 +08:00
<?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>
2018-08-01 00:15:26 +08:00
</project>
```
2019-03-08 21:39:27 +08:00
 Gradle 只需要几行代码
2018-08-01 00:15:26 +08:00
```java
2019-03-08 21:39:27 +08:00
dependencies {
    testCompile "junit:junit:4.10"
2018-08-01 00:15:26 +08:00
}
```
2019-03-08 21:39:27 +08:00
# 三、Maven
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## 概述
2018-08-01 00:15:26 +08:00
提供了项目对象模型POM文件来管理项目的构建。
2019-03-08 21:39:27 +08:00
## 仓库
2018-08-01 00:15:26 +08:00
仓库的搜索顺序为:本地仓库、中央仓库、远程仓库。
2019-03-08 21:39:27 +08:00
- 本地仓库用来存储项目的依赖库;
- 中央仓库是下载依赖库的默认位置;
- 远程仓库,因为并非所有的库存储在中央仓库,或者中央仓库访问速度很慢,远程仓库是中央仓库的补充。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## POM
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
POM 代表项目对象模型它是一个 XML 文件保存在项目根目录的 pom.xml 文件中。
2018-08-01 00:15:26 +08:00
```xml
<dependency>
2019-03-08 21:39:27 +08:00
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
2018-08-01 00:15:26 +08:00
</dependency>
```
2019-03-08 21:39:27 +08:00
[groupId, artifactId, version, packaging, classifier] 称为一个项目的坐标其中 groupId、artifactId、version 必须定义packaging 可选默认为 Jarclassifier 不能直接定义的需要结合插件使用。
2018-08-01 00:15:26 +08:00
2018-11-24 11:12:37 +08:00
2019-03-08 21:39:27 +08:00
- groupId项目组 Id必须全球唯一
- artifactId项目 Id即项目名
- version项目版本
- packaging项目打包方式。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## 依赖原则
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
### 1. 依赖路径最短优先原则
2018-08-01 00:15:26 +08:00
```html
2019-03-08 21:39:27 +08:00
A -> B -> C -> X(1.0)
A -> D -> X(2.0)
2018-08-01 00:15:26 +08:00
```
2019-03-08 21:39:27 +08:00
由于 X(2.0) 路径最短所以使用 X(2.0)。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
### 2. 声明顺序优先原则
2018-08-01 00:15:26 +08:00
```html
2019-03-08 21:39:27 +08:00
A -> B -> X(1.0)
A -> C -> X(2.0)
2018-08-01 00:15:26 +08:00
```
2019-03-08 21:39:27 +08:00
 POM 中最先声明的优先上面的两个依赖如果先声明 B那么最后使用 X(1.0)。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
### 3. 覆写优先原则
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
 POM 内声明的依赖优先于父 POM 中声明的依赖。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
## 解决依赖冲突
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
找到 Maven 加载的 Jar 包版本使用 `mvn dependency:tree` 查看依赖树根据依赖原则来调整依赖在 POM 文件的声明顺序。
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +08:00
# 参考资料
2018-08-01 00:15:26 +08:00
2019-03-08 21:39:27 +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)
2018-08-01 00:15:26 +08:00