网易首页 > 网易号 > 正文 申请入驻

gradle中的build script详解

0
分享至

简介

build.gradle是gradle中非常重要的一个文件,因为它描述了gradle中可以运行的任务,今天本文将会带大家体验一下如何创建一个build.gradle文件和如何编写其中的内容。

project和task

gradle是一个构建工具,所谓构建工具就是通过既定的各种规则,将原代码或者原文件通过一定的task处理过后,打包生成目标文件的步骤。

所以我们在gradle中有两个非常重要的概念,分别是项目和任务。

每一个gradle的构建任务可以包含一个或者多个项目,项目可以有多种类型,比如是一个web项目或者一个java lib项目等。为了实现project要完成的目标,需要定义一个个的task来辅助完成目标。

task主要用来执行特定的任务,比如编译class文件,打包成jar,生成javadoc等等。

一个例子

接下来我们使用一个具体的例子来讲解一下,gradle到底是怎么用的。

首先我们创建一个新的project目录:

$ mkdir gradle-test
$ cd gradle-test

gradle提供了一个init方法,来方便的创建gradle项目的骨架,我们用下看:

gradle init
Starting a Gradle Daemon (subsequent builds will be faster)

Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3

Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1

Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit 4) [1..4] 1

Project name (default: gradle-test):
Source package (default: gradle.test):

> Task :init
Get more help with your project: https://docs.gradle.org/6.7/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 45s
2 actionable tasks: 2 executed

按照你的需要,经过一系列的选择之后,就可以生成一个基本的gradle项目了。

我们看下生成的文件和目录:


├── app
│ ├── build.gradle
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── gradle
│ │ │ └── test
│ │ │ └── App.java
│ │ └── resources
│ └── test
│ ├── java
│ │ └── gradle
│ │ └── test
│ │ └── AppTest.java
│ └── resources
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

14 directories, 8 files

其中gradle-wrapper是帮你自动设置和安装gradle的工具,同时它还提供了gradlew和gradlew.bat这两个执行文件,用来执行gradle的任务。

我们主要看其中的两个配置文件,settings.gradle和build.gradle。

settings.gradle中配置的是gradle中要build的项目信息:

rootProject.name = 'gradle-test'
include('app')

上面的例子中,rootProject.name指定了项目的名字,include(‘app’)表示需要引入一个叫做app的子项目,这个子项目中包含着实际的要打包的内容。

再看一下app中的build.gradle文件:

plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}

repositories {
// Use JCenter for resolving dependencies.
jcenter()
}

dependencies {
// Use JUnit test framework.
testImplementation 'junit:junit:4.13'

// This dependency is used by the application.
implementation 'com.google.guava:guava:29.0-jre'
}

application {
// Define the main class for the application.
mainClass = 'gradle.test.App'
}

很简单,指定了插件,仓库地址,依赖包和应用程序的main class路径。

一切准备好之后,我们就可以进行构建和运行了。

有两种方式来运行,一种方式就是使用系统自带的gradle命令,一种方式就是使用刚刚gradle为你生成的gradlew。

gradle run

> Configure project :app
Repository {repo.url} replaced byREPOSITORY_URL .

> Task :app:run
Hello World!
gradle build

> Configure project :app
Repository {repo.url} replaced byREPOSITORY_URL .

BUILD SUCCESSFUL in 2s
7 actionable tasks: 6 executed, 1 up-to-date

你还可以带上 –scan 参数将build上传到gradle scan中,得到更加详细的构建分析:

./gradlew build --scan

BUILD SUCCESSFUL in 0s
7 actionable tasks: 7 executed

Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service.
Do you accept these terms? [yes, no] yes

Gradle Terms of Service accepted.

Publishing build scan...
https://gradle.com/s/5u4w3gxeurtd2

task详细讲解

上面的例子中,我们使用的都是gradle默认的tasks,并没有看到自定义task的使用,接下来我们将会探讨一下,如何在build.gradle编写自己的task。

这里我们使用的groovy来编写build.gradle,所以我们可以像运行代码一样来运行它。

task脚本

先创建一个非常简单的task:

task hello {
doLast {
println 'Hello www.flydean.com!'
}
}

上面定义了一个名叫hello的task,并且会在执行最后输出 “Hello www.flydean.com!”。

我们这样运行:

gradle -q hello
Hello www.flydean.com!

-q的意思是悄悄的执行,将会忽略gradle自身的log信息。我们把要执行的task名字写在gradle后面就可以了。

如果你熟悉ant命令的话,可以看到gradle的task和ant很类似,不过更加的强大。

因为是groovy脚本,所以我们可以在其中执行代码:

task upper {
doLast {
String someString = 'www.flydean.com'
println "Original: someString"
println "Upper case:{someString.toUpperCase()}"
}
}

运行结果:

> gradle -q upper
Original: www.flydean.com
Upper case: WWW.FLYDEAN.COM

或者执行times操作:

task count {
doLast {
4.times { print "$it " }
}
}
> gradle -q count
0 1 2 3
task依赖

gradle中的一个task可以依赖其他的task:

task hello {
doLast {
println 'Hello www.flydean.com!'
}
}
task intro {
dependsOn hello
doLast {
println "I'm flydean"
}
}

上面两个task的顺序是无关的,可以依赖的写在前面,被依赖的写在后面,或者反过来都成立。

动态task

除了静态的task之外,我们还可以通过代码来动态创建task:

4.times { counter ->
task "taskcounter" {
doLast {
println "I'm task numbercounter"
}
}
}
> gradle -q task1
I'm task number 1

我们还可以将task看做成为一个对象,调用gradle的api进行操作:

4.times { counter ->
task "taskcounter" {
doLast {
println "I'm task numbercounter"

task0.dependsOn task2, task3

上面的例子中,我们调用API手动创建了task之间的依赖关系:

> gradle -q task0
I'm task number 2
I'm task number 3
I'm task number 0

还可以task之间的属性调用:

task myTask {
ext.myProperty = "www.flydean.com"

task printTaskProperties {
doLast {
println myTask.myProperty
}
}
默认task

如果不想每次都在调用gradle命令的时候手动指定某个具体的task名字,我们可以使用defaultTasks:

defaultTasks 'clean', 'run'

task clean {
doLast {
println 'Default Cleaning!'
}
}

task run {
doLast {
println 'Default Running!'
}
}

task other {
doLast {
println "I'm not a default task!"
}
}

上面的代码执行gradle和gradle clean run是相当的。

build script的外部依赖

既然build script可以用groovy代码来编写,那么如果我们想要在build script中使用外部的jar包怎么办呢?

这个时候,我们可以将外部依赖放到buildscript()方法中,后面的task就可以使用引入的依赖了:

import org.apache.commons.codec.binary.Base64

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
}
}

task encode {
doLast {
def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
println new String(encodedString)
}
}

上面的例子中,encode使用了一个外部的依赖包Base64,这个依赖包是在buildscript方法中引入的。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
孙浩和张嘉译庆功,张艺谋带着陈婷来了,陈婷的脸比王海燕小一圈

孙浩和张嘉译庆功,张艺谋带着陈婷来了,陈婷的脸比王海燕小一圈

天马幸福的人生
2026-06-07 20:40:08
2010年深圳女子重症抢救,丈夫拔掉呼吸机致其死亡,法院判决亮了

2010年深圳女子重症抢救,丈夫拔掉呼吸机致其死亡,法院判决亮了

猫眼观史
2025-04-11 22:19:55
心跳决定寿命?研究发现:心率超过这个数,或致死亡风险飙升!

心跳决定寿命?研究发现:心率超过这个数,或致死亡风险飙升!

39健康网
2026-06-08 18:30:36
惊天战损 —— 俄罗斯难以承受之重

惊天战损 —— 俄罗斯难以承受之重

细雨中的呼喊
2026-06-08 14:40:44
史诗级交易,NBA都传疯了!戴维斯也走了,湖人哭晕在厕所

史诗级交易,NBA都传疯了!戴维斯也走了,湖人哭晕在厕所

体育新角度
2026-06-08 16:48:09
追踪24年,科学家发现一个人的“生物钟”走得越快,寿命就越短

追踪24年,科学家发现一个人的“生物钟”走得越快,寿命就越短

混沌录
2026-05-06 23:43:06
持续四年的战争,已经把乌克兰的人口结构彻底砸穿。

持续四年的战争,已经把乌克兰的人口结构彻底砸穿。

空想之喵
2026-04-23 11:08:03
莫言:如果你混到没人找你吃饭,没人喊你聚会,连电话也没几个,那庆祝了,你不是人缘变差,而是真正觉醒了

莫言:如果你混到没人找你吃饭,没人喊你聚会,连电话也没几个,那庆祝了,你不是人缘变差,而是真正觉醒了

品读时刻
2026-05-27 09:00:58
毛主席心中之痛:为何1955年授衔时,井冈山籍将领只有一个?

毛主席心中之痛:为何1955年授衔时,井冈山籍将领只有一个?

浩渺青史
2026-05-26 19:52:05
网友美国尔湾偶遇何洁刁磊,携孩子餐厅吃面,称她已在此买房定居

网友美国尔湾偶遇何洁刁磊,携孩子餐厅吃面,称她已在此买房定居

草莓解说体育
2026-06-08 13:54:51
美媒:黎巴嫩局势为何牵动美伊和谈?

美媒:黎巴嫩局势为何牵动美伊和谈?

参考消息
2026-06-07 15:23:05
女主播被炸伤案开庭“希望重判 害怕再被报复”

女主播被炸伤案开庭“希望重判 害怕再被报复”

看看新闻Knews
2026-06-08 12:13:17
洛夫顿启程回国!将缺席9号夺冠活动,发文致谢上海球迷支持!

洛夫顿启程回国!将缺席9号夺冠活动,发文致谢上海球迷支持!

篮球资讯达人
2026-06-07 23:56:39
"新疆棉"事件5年后,始作俑者悄悄改名,如今丑态百出大快人心

"新疆棉"事件5年后,始作俑者悄悄改名,如今丑态百出大快人心

闻识
2026-06-04 19:12:57
CCTV5直播:国足vs泰国,武磊百场仪式,国足世界排名有望再提升

CCTV5直播:国足vs泰国,武磊百场仪式,国足世界排名有望再提升

青烟小先生
2026-06-08 16:48:34
50岁陈坤现身侄子毕业典礼!18岁侄子曝光,这基因太逆天了

50岁陈坤现身侄子毕业典礼!18岁侄子曝光,这基因太逆天了

今古深日报
2026-06-08 09:44:20
中国人最擅长取外号了,网友:这评论区没半小时出不去

中国人最擅长取外号了,网友:这评论区没半小时出不去

另子维爱读史
2026-05-31 08:10:46
8年前,施一公砸200亿建起西湖大学,放话5年比肩清华,现在咋样

8年前,施一公砸200亿建起西湖大学,放话5年比肩清华,现在咋样

杰丝聊古今
2026-06-07 17:43:29
网红董赤赤栽了:1300万粉丝、54万债务,她的结局比想象中惨得多

网红董赤赤栽了:1300万粉丝、54万债务,她的结局比想象中惨得多

橙星文娱
2026-06-03 11:31:20
乌克兰击中关键节点琼加尔大桥!补给更加恶化:克里米亚饮食限购

乌克兰击中关键节点琼加尔大桥!补给更加恶化:克里米亚饮食限购

鹰眼Defence
2026-06-08 16:42:53
2026-06-08 19:27:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

干掉聊天框,ChatGPT不只回答,还要办事

头条要闻

干部收商人好处承诺的上千万元项目却黄了 当事人发声

头条要闻

干部收商人好处承诺的上千万元项目却黄了 当事人发声

体育要闻

2026年世界杯?到底会是什么样?

娱乐要闻

越扒越有!奔跑吧文旅合作费近两千万

财经要闻

沪指失守4000点!A股巨震,原因找到了

汽车要闻

从真实事故场景出发 吉利银河星舰7 EV硬核安全“超纲”了

态度原创

教育
时尚
家居
房产
本地

教育要闻

不要每天都去玩了,作业也是要做的

夏季穿衣别太单调,千万别错过这几款露肩上衣,舒适高级显瘦

家居要闻

自由流光 回溯生活真意

房产要闻

10,000元大奖等你拿!广州城投地产IP形象设计大赛火热开启!以创意贏未来!

本地新闻

用杨柳青年画的方式,打开天津

无障碍浏览 进入关怀版