有道无术,术尚可求,有术无道,止于术。
文章目录
常用构建工具介绍
项目构建和管理需要工具,提供工程结构、代码编译打包、依赖管理、 二进制库管理等等功能,一般常用的有以下几种。
Ant
Ant
于2000年发布,是一个基于Java 开发的构建工具,Apache开源
,但是用的人很少,几乎销声匿迹,感兴趣可以看看。
Maven
2004年发布,采用项目对象模型 (POM) 的概念,几乎国人开发都使用这个,但Maven
烦冗的XML配置是它最大的缺点。
Gradle
2012年,应用于google
的一款项目管理工具,集Ant、Maven二者之大成,越来越多的开发者都将项目迁移到了Gradle
上,比如Spring 、Spring Boot等等。
Gradle概述
Gradle 是一个开源构建自动化工具,其设计足够灵活,可以构建几乎任何类型的程序。
以下是其一些最重要功能的高级概述:
- 高性能:Gradle 实现了许多其他优化,构建速度快,开发团队不断努力提高 Gradle 的性能。
- JVM基础:Gradle 在 JVM 上运行。
- 扩展性:Gradle 支持插件机制,所以我们可以复用这些插件,就如同复用库一样简单方便。
- IDE 支持:支持Android Studio、IntelliJ IDEA、Eclipse 和 NetBeans。Gradle 还支持生成将项目加载到 Visual Studio 所需的解决方案。
- Gradle 是 Android 的官方构建工具,支持多种流行语言和技术。
缺点:
- 版本向下兼容性不是很好,目前新版为7.X版本
- 学习成本高,需要学习groovy脚本语言
安装
可以在 Linux、macOS 或 Windows 上安装 Gradle 构建工具。
下载地址
下载后解压:
直接解压就行了,但是需要安装JDK1.8或更高版本,Gradle 带有自己的 Groovy 库
,因此不需要安装 Groovy,Gradle 会忽略任何现有的 Groovy 安装,也就是使用内置的Groovy 。
添加环境变量GRADLE_HOME
,变量值为解压目录。
在Path 中加入%GRADLE_HOME%\bin
:
输入gradle -v
查看是否配置成功,很简单,和安装JDK一样。
使用IDEA 创建一个Gradle 项目
选择Gradle
构建一个普通的JAVA Web 程序。
创建的工程目录如下:
Gradle 使用的目录和文件
Gradle 使用两个主要目录来执行和管理其工作:Gradle 用户主目录
和项目根目录
。
用户目录
用户目录在当前电脑登录的用户名目录下:
Gradle 用户主目录($USER_HOME/.gradle)
用于存储全局配置属性和初始化脚本以及缓存和日志文件。大致结构如下:
├── caches // 全局缓存目录(适用于非项目特定的所有内容)
│ ├── 4.8 //特定于版本的缓存(例如,支持增量构建)
│ ├── 4.9
│ ├── ⋮
│ ├── jars-3 // 共享缓存(例如,用于依赖项的工件)
│ └── modules-2
├── daemon // Gradle 守护进程的注册表和日志
│ ├── ⋮
│ ├── 4.8
│ └── 4.9
├── init.d // 全局初始化脚本
│ └── my-setup.gradle
├── jdks // 工具链支持下载的JDK
│ ├── ⋮
│ └── jdk-14.0.2+12
├── wrapper
│ └── dists // Gradle Wrapper下载的发行版
│ ├── ⋮
│ ├── gradle-4.8-bin
│ ├── gradle-4.9-all
│ └── gradle-4.9-bin
└── gradle.properties // 全局Gradle 配置属性
从 4.10 版本开始,Gradle 会自动清理其用户主目录。当 Gradle 守护程序停止或关闭时,清理会在后台运行。
项目根目录
项目根目录大致结构如下:
├── .gradle // Gradle 生成的项目特定缓存目录
│ ├── 4.8 // 特定于版本的缓存(例如,支持增量构建)
│ ├── 4.9
│ └── ⋮
├── build // 此项目的构建目录,Gradle 在其中生成所有构建工件。
├── gradle // 包含Gradle Wrapper的 JAR 文件和配置
│ └── wrapper
├── gradle.properties // 项目特定的Gradle 配置属性
├── gradlew // 使用Gradle Wrapper执行构建的脚本
├── gradlew.bat // 使用Gradle Wrapper执行构建的脚本
├── settings.gradle or settings.gradle.kts // 定义子项目列表的项目设置文件
├── subproject-one // 通常一个项目被组织成一个或多个子项目
| └── build.gradle or build.gradle.kts // 每个子项目都有自己的 Gradle 构建脚本
├── subproject-two
| └── build.gradle or build.gradle.kts
└── ⋮
从 4.10 版本开始,Gradle 会自动清理项目特定的缓存目录。构建项目后,会定期(最多每 24 小时)检查特定版本的缓存目录.gradle/<gradle-version>/
是否仍在使用中。如果 7 天未使用它们,它们将被删除。
build.gradle
build.gradle
是项目的构建配置文件,和pom.xml
类似,可以管理依赖、配置、插件等。
默认最基础的结构如下:
// 插件
plugins {
id 'java'
id 'war'
}
// 机构
group 'com.ali'
// 版本
version '1.0-SNAPSHOT'
// JDK 编译版本
sourceCompatibility = 1.8
// 仓库地址
repositories {
// Maven中央仓库,http://repo1.maven.org/maven2/
// jCenter:是由JFrog公司提供的Bintray中的Java仓库
mavenCentral()
}
// 第三方依赖包
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
testCompile group: 'junit', name: 'junit', version: '4.12'
implementation 'com.alibaba:fastjson:2.0.6'
}
settings.gradle
settings.gradle
无论有多少个子模块,该文件只会有一个,且一定在根项目中,它的主要作用是配置项目或者依赖之间的关系。
默认只有一个根目录文件的名称:
rootProject.name = 'a-gradle'
gradlew.bat
Windows 环境下当前工程gradle
环境命令执行脚本,比如gradlew.bat -v
查看当前工程下的gradle
版本,明明我们之前安装的版本为7.4,这里为啥又是5.2.1呢?(后面分析)
gradlew
Linux 环境下当前工程gradle
环境命令执行脚本。
gradle.wrapper
wrapper
是创建项目时自动下载的一个文件夹,该目录下有2个文件:gradle-wrapper.jar
和gradle-wrapper.properties
。
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
查看gradle-wrapper.properties
:
// 系统用户目录
distributionBase=GRADLE_USER_HOME
// 下载位置
distributionPath=wrapper/dists
// 下载的gradle的地址,使用的版本
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
// 安装基础目录
zipStoreBase=GRADLE_USER_HOME
// 安装子目录
zipStorePath=wrapper/dists
在C 盘用户目录,可以看到当前工程帮我们下载的Gradle。
由此可见wrapper
目录的主要作用是配置并下载当前工程的Gradle
环境,但是奇怪的是之前我们不是已经安装了Gradle了吗?为啥还要下载?
这是因为gradle
发版本比较快,而且大多数不向下兼容,如果有一个项目使用的Gradle
版本为5.0,你本地环境是7.0,那么很可能就无法使用7.0 版本的Gradle
来编译打包,为了解决这种问题,Gradle
就想出包装的做法,每个工程都会有自己单独的Gradle
包装构建环境。。。这也是比较麻烦的一点。。。。
Wrapper 工作流程如下所示:
- 自动下载该工程声明的Gradle 版本
- 存储到用户目录下
- 构建项目时,使用当前的Gradle 环境
.gradle
.gradle
是Gradle 生成的项目特定缓存目录,每个版本创建一个缓存目录(例如,支持增量构建)。
build
build
目录用于存放编译、打包的文件。
Gradle 工具栏
在IDEA 最右侧,和Maven 一样,也有一个工具栏按钮,打开之后可以看到该工程的依赖和任务。
Source Sets
包含了main
和test
两个目录,分别显示当前程序主目录和测试目录包含的所有依赖包。
Tasks
下包含多个任务,它是Gradle中最小的执行单元,和Maven 中的目标一样,也可以直接理解为一个功能,如下图所示中,
可以看到已经分好类的众多任务: