Gradle 简易入门教程
作者: Yann
来源:原力注入
Gradle 是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于 Groovy(现在也支持 Kotlin)的内部领域特定语言。
Gradle特点
Gradle是很成熟的技术,可以处理大规模构建
Gradle对多语言、多平台支持性更好
Gradle关注在构建效率上
Gradle发布很频繁,重要feature开发计划透明化
Gradle社区很活跃,并且增加迅速
安装Gradle
从 官网 (https://gradle.org/install/)下载二进制文件。
解压Zip文件,加入环境变量(在PATH中加入GRADLE_HOME/bin目录)
如果在安装过程中遇到问题,可以进一步查看官方的安装指南(https://gradle.org/install/)。最后验证一下 Gradle 是否工作正常
gradle -v
------------------------------------------------------------
Gradle 4.2.1
------------------------------------------------------------
Build time: 2017-10-02 15:36:21 UTC
Revision: a88ebd6be7840c2e59ae4782eb0f27fbe3405ddf
Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_162-ea (Oracle Corporation 25.162-b01)
OS: Mac OS X 10.13.5 x86_64
Gradle快速体验
初始化一个项目
创建一个 demo 目录
❯ mkdir gradle-demo
初始化 Gradle 项目
❯ gradle init
Starting a Gradle Daemon (subsequent builds will be faster)
BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed
Gradle目录结构
我们看看上一步我们生成了什么文件
├── build.gradle ❶├── gradle│ └── wrapper│ ├── gradle-wrapper.jar ➋│ └── gradle-wrapper.properties ➌├── gradlew ➍├── gradlew.bat ➎└── settings.gradle ➏
❶ 当前项目的配置脚本
➋ Gradle Wrapper 的执行jar包(后续介绍)
➌ Gradle Wrapper 的配置文件
➍ Gradle Wrapper Unix 系执行脚本
➎ Gradle Wrapper Windows 系执行脚本
➏ 项目脚本设置
创建一个Task
Gradle提供了用于通过基于Groovy或Kotlin的DSL创建和配置。项目包括一组Task,每个Task执行一些基本操作。
创建一个目录叫 src
在src目录创建一个 myfile.txt
在构建文件中定义一个名为Copy的类型 Task ,该任务将src目录复制到名为dest的新目录
groovy代码:
task copy(type: Copy, group: "Custom", description: "Copies sources to the dest directory") {
from "src"
into "dest"
}
kotlin代码:
tasks.create<Copy>("copy") {
description = "Copies sources to the dest directory"
group = "Custom"
from("src")
into("dest")
}
group 和 description 是自定义的任意值。现在让我们执行这个 task
❯ ./gradlew copy
> Task :copy
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
再一次 ls 我们就可以看见 gradle 为我们创建了一个新的 dest 目录并且将 文件复制进去。
Gradle Task
在Gradle中,有两个基本概念:项目和任务。
项目是指我们的构建产物(比如Jar包)或实施产物(将应用程序部署到生产环境)一个项目包含一个或多个任务。
任务是指不可分的最小工作单元,执行构建工作(比如编译项目或执行测试)。
在项目目录中的 build.gradle 指定了一个项目和它的任务。
Task执行顺序
任务可能依赖于其他任务,或者可能被安排为始终在另一个任务之后运行。
project('projectA') {
task taskX(dependsOn: ':projectB:taskY') {
doLast {
println 'taskX'
}
}
}
project('projectB') {
task taskY {
doLast {
println 'taskY'
}
}
}
> gradle -q taskX
taskY
taskX // taskx 在 y 之后
我们可以用 dependsOn 让我们的 Task 有顺序的运行起来。
Gradle插件
看到这里,如果每一件事情我们都需要写 Task 岂不是会累死,而且很多功能是可以被复用的,所以Gradle 提供一个 插件 功能,Gradle 默认就内置了大量的插件,比如在 base 中有一系列的功能。
groovy代码:
plugins {
id "base"
}
kotlin代码:
plugins {
id("base")
}
这个时候我们就可以利用一些额外的 Task,举个例子,我们要把一个目录中的东西都打成一个 ZIP 压缩包。
groovy代码:
task zip(type: Zip, group: "Archive", description: "Archives sources in a zip file") {
from "src"
setArchiveName "basic-demo-1.0.zip"
}
kotlin代码:
tasks.create<Zip>("zip") {
description = "Archives sources in a zip file"
group = "Archive"
from("src")
setArchiveName("basic-demo-1.0.zip")
}
Gradle 的设计理念是
在项目中添加新任务
为新加入的任务提供默认配置,这个默认配置会在项目中注入新的约定(如源文件位置)。
加入新的属性,可以覆盖插件的默认配置属性。
为项目加入新的依赖。
Gradle Java
Gradle 内置了 Java 插件,Java插件将Java编译以及测试和捆绑功能添加到项目中。它是许多其他Gradle插件的基础。如果我们需要使用 Java 插件 修改 build.gradle
plugins {
id 'java'
}
一旦导入了 Java 插件,就会有一系列的默认的配置值,并且会导入大量的 Task。
Task | 含义 |
---|---|
compileJava(type: JavaCompile) | Java 编译 |
processResources(type: Copy) | 拷贝 Resources 资源 |
classes(type: Task) | 组装 Java 类 |
compileTestJava(type: JavaCompile) | Java Test 编译 |
processTestResources(type: Copy) | 拷贝 Test Resources 资源 |
testClasses(type: Task) | 组装 Test 类 |
jar(type: Jar) | 合成Jar包 |
javadoc(type: Javadoc) | 生成 doc 文档 |
test(type: Test) | 运行测试 |
uploadArchives(type: Upload) | 上传 jar 到仓库 |
clean(type: Delete) | clean |
我们从这些 Task 名字就可以看出来他们分别作作了, 和其他的设计理念类型,在 Task 也会嵌入一些生命周期,其实原理也就是我们之前看的执行顺序。
资源:Gradle插件仓库
Gradle依赖管理
先盗取一张官方的图。
和 Maven 类似,Gradle 也会将依赖缓冲在本地中,方便在无网的环境使用,和依赖管理相关的有两个参数,举个例子。
repositories {
mavenCentral() // 定义仓库
}
dependencies {
compile 'org.springframework:spring-web:5.0.2.RELEASE' // 定义依赖
}
Gradle支持以下仓库格式:
Ivy仓库
Maven仓库
Flat directory仓库
lvy仓库
我们可以通过URL地址或本地文件系统地址,将Ivy仓库加入到我们的构建中。
repositories {
ivy {
url "http://ivy.petrikainulainen.net/repo"
}
}
//或者是本地
repositories {
ivy {
url "../ivy-repo"
}
}
Maven仓库
repositories {
maven {
url "http://maven.petrikainulainen.net/repo"
}
}
在加入Maven仓库时,Gradle提供了三种“别名”供我们使用,它们分别是
mavenCentral()别名,表示依赖是从Central Maven 2 仓库中获取的。
jcenter()别名,表示依赖是从Bintary’s JCenter Maven 仓库中获取的。
mavenLocal()别名,表示依赖是从本地的Maven仓库中获取的。
Flat Directory仓库
repositories {
flatDir {
dirs 'lib'
}
}
//多个仓库
repositories {
flatDir {
dirs 'libA', 'libB'
}
}
依赖管理
在配置完项目仓库后,我们可以声明其中的依赖,首先 Java 插件指定了若干依赖配置项
compile 配置项中的依赖是依赖必须的。
runtime 配置项中包含的依赖在运行时是必须的。
testCompile 配置项中包含的依赖在编译项目的测试代码时是必须的。
testRuntime 配置项中包含的依赖在运行测试代码时是必须的。
在 Gradle 最新版本中更是增加
implementation 配置项中的实现类
api 配置项中的暴露API
dependencies {
api 'commons-httpclient:commons-httpclient:3.1'
implementation 'org.apache.commons:commons-lang3:3.5'
}
声明项目依赖
最普遍的依赖称为外部依赖,这些依赖存放在外部仓库中。一个外部依赖可以由以下属性指定:
group属性指定依赖的分组(在Maven中,就是groupId)
name属性指定依赖的名称(在Maven中,就是artifactId)
version属性指定外部依赖的版本(在Maven中,就是version)
dependencies {
compile group: 'foo', name: 'foo', version: '0.1'
}
// 我们也可以合并到一起去
dependencies {
compile 'foo:foo:0.1'
}
声明项目文件依赖
我们如何依赖本地的一些 jar 呢,正确的操作是如下
dependencies {
compile files('libs/commons-lang.jar', 'libs/log4j.jar')
}
声明依赖排除项目
我们都知道在 Maven中我们有
<dependency>
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
而在 Gradle 中,我们可以这么做。
compile('com.example.m:m:1.0') {
exclude group: 'org.unwanted', module: 'x
}
Gradle与Kotlin
我们想要在 gradle 中增加 kotlin 非常的简单,仅仅需要在 build.gradle 增加
plugins {
id "org.jetbrains.kotlin.jvm" version "x.x.xx" // 增加插件
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:x.xx.xx" // 增加依赖
}
大功告成,对了,默认的 Kotlin 的源码路径是 src/main/kotlin, 测试源码是 src/text/kotlin 如果需要修改可以使用
sourceSets {
main.kotlin.srcDirs += 'src/main/myKotlin'
main.java.srcDirs += 'src/main/myJava'
}
其他
Gradle Wrapper
Gradle Wrapper 做了三件事情
解析参数传入 gradlew
安装正确的 Gradle 版本
调用 Gradle 执行命令
Ops,Gradle Wrapper 为什么还需要安装 Gradle,我们在用 Maven 都知道,我们需要自己先安装好一个 Maven版本,因为 Maven 发展多年,现在已经稳定,已经不存在很多个版本并存的现状了,但是我们依然需要去在每个机器上去安装,那我什么我们不能在自己的 构建脚本 中就指定我们的构建工具呢?所以我们在 wrapper/gradle-wrapper.properties 中就可以发现 distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip 这里也就是定义了我们的gradle所使用的版本。
Gradle In Real World
// 定义一堆基础插件
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: "jacoco"
apply plugin: 'checkstyle'
apply plugin: 'pmd'
apply plugin: 'findbugs'
apply plugin: 'eclipse'
apply plugin: 'idea'
// 定义项目属性
group = 'Common'
version = '1.0.0'
description = """Giant common library"""
// 定义依赖仓库
repositories {
mavenCentral()
}
// 额外增加source path
sourceSets {
main {
resources {
srcDir "src/main/profiles/${profile}"
}
}
}
// project依赖
dependencies {
compile 'ch.qos.logback:logback-core:1.0.13'
compile 'ch.qos.logback:logback-classic:1.0.13'
compile 'ch.qos.logback:logback-access:1.0.13'
compile 'commons-io:commons-io:2.0.1'
compile 'commons-lang:commons-lang:2.6'
compile 'joda-time:joda-time:1.6.2'
compile 'org.testng:testng:6.8.7'
compile 'com.googlecode.jmockit:jmockit:1.5'
...
}
// task配置
checkstyle {
ignoreFailures = true
sourceSets = [sourceSets.main]
}
findbugs {
ignoreFailures = true
sourceSets = [sourceSets.main]
}
pmd {
ruleSets = ["basic", "braces", "design"]
ignoreFailures = true
sourceSets = [sourceSets.main]
}
jacocoTestReport {
reports {
xml.enabled true
html.enabled true
csv.enabled false
}
sourceSets sourceSets.main
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
test {
useTestNG()
jacoco {
excludes = ["org.*"]
}
}
Gradle常用指令
枚列所有可用任务
❯ gradle tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Archive tasks
-------------
zip - Archives sources in a zip file
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
clean - Deletes the build directory.
构建配置属性
❯ gradle properties
显示构建详情
在 build.gradle 设置
logging.level = LogLevel.DEBUG
或者在运行的
❯ gradle build --stacktrace
参考资料&推荐文档
Gradle入门教程(http://blog.jobbole.com/71999/)
Gradle介绍(https://www.jianshu.com/p/00d5469e25e7)
官方教材(https://guides.gradle.org/creating-new-gradle-builds/)
-END-
近期热文:
JIRA配置手册 (3):字段和界面
JIRA配置手册 (2):工作流
JIRA配置手册 (1):问题类型管理
HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
你真的了解lambda吗?一文让你明白lambda用法与源码分析
程序员格斗指南
设计RPC接口时,你有考虑过这些吗?
阿里巴巴硅谷 Istio 专家解读Istio 1.0 发布
如何用图像识别玩忍术?
来自95后的天池中间件大赛总结
为Spring Cloud Config插上管理的翅膀
Spring Cloud Config采用Git存储时两种常用的配置策略
Hystrix降级逻辑中如何获取触发的异常?
重磅剧透!阿里巴巴计划开源 Nacos,为Dubbo生态发展铺路
Spring Cloud Config采用数据库存储配置内容
你可能会忽略的 Git 提交规范
SpringBoot应用部署于外置Tomcat容器
Gradle 简易入门教程相关推荐
- layui个人中心html,Layui的简易入门教程
layui是一款采用自身模块规范编写的前端UI框架,非常适合界面的快速开发.本篇文章给大家分享一下Layui的简易入门教程,介绍一下layui如何在你的项目中使用. 获得 layui 后,将其完整地部 ...
- Markdown 简易入门教程
自己整理的 Markdown 简介.编辑器推荐.语法.特征等,是 Markdown 的简易入门教程 目录 概述 简介 官方文档 Markdown编辑器 初级语法 标题 粗体和斜体 段落和换行 分隔线 ...
- FL studio 20简易入门教程 -- 第四篇 -- 钢琴卷帘窗口与单轨乐器编辑界面
钢琴卷帘窗口与单轨乐器编辑界面 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 钢琴卷帘窗口与单轨乐器编辑界面 前言 单轨乐器编辑界面 上方菜单 ...
- FL studio 20简易入门教程 -- 第九篇 -- 完整编曲流程
技巧合集 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 技巧合集 前言 完整编曲流程 1.设置速度 2.内容录制 3.钢琴卷帘窗口编辑 4.设 ...
- mac os x使用Git简易入门教程
该入门教程的流程是这样的: 什么是Git----------------->为什么选择Git----------------->如何安装Git到MAC OS X-------------- ...
- 最新翻译的官方PyTorch简易入门教程(PyTorch1.0版本)
"PyTorch 深度学习:60分钟快速入门"为PyTorch官网教程,网上已经有部分翻译作品,随着PyTorch1.0版本的公布,这个教程有较大的代码改动,本人对教程进行重新翻译 ...
- 【Magicavoxel简易入门教程】(二) 第二章 · 自制一个NPC导出模型优化工具使用(附下载)
本文由@唐三十胖子出品,转载请注明出处. 文章链接:https://blog.csdn.net/iceSony/article/details/83793754 这篇文章由唐三胖ヾ(•ω•`)o网 ...
- Xgboost简易入门教程
最近准备研究一下信贷风控中机器学习模型评分卡的制作.信贷评分卡分为两种,一种是用逻辑回归,称为评分卡:一种是用集成学习算法,称为机器学习模型.逻辑回归算法相对简单,但是解释性要求高:机器学习模型理 ...
- 给萌新的Flexbox简易入门教程
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. [年末促销]葡萄城 2018 岁末福利火热放送中 原文出处:https://www.sitepoint.co ...
最新文章
- 无惧灵魂拷问!淘宝扫一扫助你不再扔错垃圾!
- PopUpWindow使用详解(二)——进阶及答疑
- row height
- 学计算机去大工中大,厦门大学和大连理工大学你 选哪个?哪个好。厦门大学和东南大学、天津大学、武汉大学、中山大学去那个...
- jbl调音软件_[马自达] 佛山马自达昂克赛拉改装美国JBL汽车音响
- React路由组件传递参数
- js提取正则中的字符串
- MyBatis的resultType和resultMap的区别
- Python 数据科学手册 5.2 Scikit-Learn 简介
- json 转对象函数_JSON_QUERY()函数从JSON数据提取对象
- [Git] 我的 Github 地址
- 下载与安装JDK以及配置环境变量(详细到每步)
- 《微观经济学》博弈论入门:囚徒困境、智猪博弈、性别战、斗鸡博弈
- 用matlab求带参数d积分,用MATLAB求定积分
- EI会议论文的格式要求
- Matplotlib做动图(基础版)
- redis存10万条数据_redis如何存储数据
- Centos7 ping 不通百度 可能是网络配置问题
- dnf商人计算机制作,DNF商人3年半时间月入50000 教你赚些零用钱
- K8S之taint\cordon\uncordon\drain使用案例——筑梦之路