Groovy 简单使用笔记

Groovy 是一种基于 JVM 的语言.
其语法特点类似于Python, Ruby 和 Smalltalk.
Groovy 代码能够与 Java 代码很好地结合, 同时也能用于扩展现有代码.
由于其运行在 JVM 上的特性, Groovy 也可以使用其他非 Java 语言编写的库

简单使用 Groovy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
version = 1.0 // 为Project的内置属性指定值
description = 'demo'

// 自定Project义属性, 所有实现了ExtensionAware接口的API都可通过ext添加属性
// gradle -P key=value task 启动时为project添加属性
// gradle -D org.gradle.project.key=value task 启动时为project添加属性
ext.project_var0 = 'value'
ext {
project_var1 = 'value'
project_var2 = 'value'
}

task _01 {
println "------------------------Task 01" // 构建阶段执行
}

task _02 {
println "------------------------Task 02"
doLast {// 运行阶段执行的Action, 晚于doFirst执行
for (i in 0..<3){
print i + ' '
}
}

doFirst {// 运行阶段执行的Action
def s = "hello"
println "First action: $s"
}
}

tasks.create(name: '_03') {
doFirst {
println "tasks属性的类型: ${tasks.class}"

// 遍历所有task
tasks.each {e ->
println e
}
}
}

tasks.create(name: '_04', dependsOn: '_02') {
doFirst {
println "Task 04 依赖 Task 02"
}
}

tasks.create(name: '_05', type: Copy) {// type的默认类型为DefaultTask, Copy类型的Task为复制文件任务
from 'build.gradle' // 源文件
into 'back' // 目标文件夹
}

task _06(dependsOn: '_02', type: DefaultTask)

class HelloTask extends DefaultTask { // 自定义Task类
// @Optional
@Internal
def message = 'Hello Task'

@TaskAction // 是用 @TaskAction 修饰的方法视为Action
def hello() {
println "HelloTask -> hello(): $message"
}

def info() {
println "HelloTask -> info(): $message"
}
}

task hello(type: HelloTask) {
doFirst {
info()
}
}

task hello2(type: HelloTask) {
message = 'HELLO2'
}

// 使用外部自定义Task类
task myTask(type: test.MyTask)

task myTask2(type: test.MyTask) {
file = file('dist.txt')
doLast {
show()
}
}


apply plugin: 'java' // 引入java插件

task compile(type: JavaCompile) {// 编译Java代码任务

source = fileTree('src/main/java')
classpath = sourceSets.main.compileClasspath
destinationDirectory = file('build/classes/main')
options.fork = true
options.incremental = true
}

task run(type: JavaExec, dependsOn: 'compile') {// 运行Java代码任务

classpath = sourceSets.main.runtimeClasspath
mainClass = 'Test'
}

task showProps { // 显示Project和Task的内置属性
description = 'showProps' // 为Task的内置属性配置值

// 自定Task义属性
ext.task_var0 = 'value'
ext {
task_var1 = 'value'
task_var2 = 'value'
}

doFirst {
println version
println description // 当Project和Task有相同属性时, 优先使用Task的属性
println project.description
}
}

task fileContentCopy { // 增量式构建
def sourceTxt = fileTree("source")
def dest = file('dist.txt')

// 增量构建的关键
inputs.dir sourceTxt
outputs.file dest

doLast {
dest.withPrintWriter {writer ->
sourceTxt.each {s ->
writer.write(s.text)
}
}
}

}

sourceSets { // 配置被依赖的源代码路径
xModel // 可将xModel项目的代码放在src/xModel/main中, 资源放在src/xModel/rsources, Gradle会创建compileXModelJava, processXModelResources, xModelClasses三个Task
}

repositories { // 定义仓库

mavenLocal()
// mavenCentral() // Maven默认仓库
// maven {
// allowInsecureProtocol = true
// 显示指定Maven仓库
// url "https://maven.aliyun.com/repository/public"
// 显示指定本地仓库
// url "C:/Users/patrick/.m2/repository"
// }

// 阿里云镜像
// maven { url 'https://maven.aliyun.com/repository/public/'}
maven{url 'https://maven.aliyun.com/nexus/content/groups/public/'}

}

configurations { //配置组
xDependence // 配置名为XDependence的依赖组

// Java 插件添加的依赖组
implementation // 主项目依赖组
compileOnly // 编译时依赖组
runtimeOnly // 运行时依赖组
testImplementation // 测试依赖组
testCompileOnly // 测试编译时依赖组
testRuntimeOnly // 测试运行时依赖组
archives // 打包时依赖组
}

dependencies { // 配置依赖
xDependence group: 'commons-logging', name: 'commons-logging', version: '1.2'
xDependence 'com.baomidou:mybatis-plus-boot-starter:3.5.1' // 简写

xDependence (group: 'net.coobird', name: 'thumbnailator', version: '0.4.17') {
// 额外配置
}
xDependence ('org.jetbrains:annotations:23.0.0') { // 简写
// 额外配置
}

xDependence 'com.alibaba:fastjson:1.2.80', 'com.google.guava:guava:31.1-jre' // 一次为一个组添加多个依赖
}

task showDependences { // 打印依赖
doFirst {
println configurations.xDependence.asPath
}
}

// 自定义插件, Gradle会为此类生成代理, 此类不能为final类
class HelloPlugin implements Plugin<Project> {

// 重写 apply 方法
void apply(Project project) {
project.extensions.creat("user", User) // 为项目额外定义属性

project.task('showUser') { // 定义任务
doLast {
println "用户名: ${project.user.name}"
}
}
}
}
final class User {
String name = ""
}


// 使用自定义插件
apply plugin: HelloPlugin // 引入自定义插件
user.name = "Patrick" // 为插件引入的项目属性赋值

// 使用外部自定义插件
apply plugin: MyPlugin