Gradle快速入门
概述
Gradle是基于Groovy的基于java应用构建工具。按照过程请参考官网。
构建块——项目和任务
在Gradle中,构建包括一个多个项目,每个项目有一个多个任务组成。
gradle中项目可以被打包成jar、war或zip文件。任务是一件单独的工作。可以包括编译类,或者创建和发布Java/web应用。简单的任务可以定义为:
task hello {
doLast {
println 'Baeldung'
}
}
如果我们build.gradle目录下执行命令gradle -q hello,运行上面任务,在控制台中可以看到输出。
任务
gradle构建脚本完全是groovy语法:
task toLower {
doLast {
String someString = 'HELLO FROM BAELDUNG'
println "Original: "+ someString
println "Lower case: " + someString.toLowerCase()
}
}
也可以定义任务依赖其他任务。语法为:dependsOn: taskName 。
task helloGradle {
doLast {
println 'Hello Gradle!'
}
}
task fromBaeldung(dependsOn: helloGradle) {
doLast {
println "I'm from Baeldung"
}
}
给任务增加行为
定义任务是可以给其增加额外行为:
task helloBaeldung {
doLast {
println 'I will be executed second'
}
}
helloBaeldung.doFirst {
println 'I will be executed first'
}
helloBaeldung.doLast {
println 'I will be executed third'
}
helloBaeldung {
doLast {
println 'I will be executed fourth'
}
}
doFirst和doLast动作分别增加在动作列表的顶部和底部,另外每个任务可以增加多次doFirst和doLast。
增加任务属性
可以给任务定义属性:
task ourTask {
ext.theProperty = "theValue"
}
这里给outTask任务设置“theValue”属性。
管理插件
有两种类型的gradle插件——脚本代码和二进制形式。每个插件需要经历两个阶段:解析与应用。解析即发现合适的插件jar版本,并增加至项目类路径中。应用插件即在项目上执行Plugin.apply(T) 。
应用脚本插件
在aplugin.gradle中可以定义任务:
task fromPlugin {
doLast {
println "I'm from plugin"
}
}
如果我们在我们的项目build.gradle文件中应用该插件,通过下面代码进行引用:
apply from: ‘aplugin.gradle’
现在执行 gradle tasks
命令任务列表中应该显示“fromPlugin”任务。
通过二进制插件使用DSL
增加核心二进制插件,可以通过名称或ID:
plugins {
id 'application'
}
现在,应该可以在项目中通过application plugin的run任务执行任何可运行jar。如果使用社区插件,需要提供完整插件id:
plugins {
id "org.shipkit.bintray" version "0.9.116"
}
上述代码引用shipkit插件,其所有任务会出现在gradle的任务列表中。
DSL插件有一些限制:
- 插件块中不支持Groovy脚本
- 插件块需要在项目构建脚本的顶部(仅buildscripts{} 块可以在其之前)
- DSL插件不能写在脚本插件、settings.gradle或初始化脚本中
DSL插件仍在孵化阶段,DSL和其他相关配置在未来gradle版本中可能会改变。
传统使用插件过程
使用“apply plugin”方式:
apply plugin: 'war'
如果你想使用社区插件,需要在buildscript{}块中 增加外部jar,然后可以在构建脚本中应用插件,但必须在任何已经存在的plugins{}块之后:
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "org.shipkit:shipkit:0.9.117"
}
}
apply plugin: "org.shipkit.bintray-release"
依赖管理
Gradle支持非常灵活的依赖管理系统,它与各种可用的方法兼容。
Gradle中依赖管理的最佳实践是版本控制、动态版本控制、解决版本冲突和管理传递依赖。
依赖配置
依赖被分为不同的配置组,每个配置有名称及依赖项。如果我们使用java插件,则会有compile, testCompile, runtime 配置可以给我们依赖进行分组。缺省配置扩展 runtime。
声明依赖
下面示例使用不同的方式增加(spring和Hibernate):
dependencies {
compile group:
'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'
compile 'org.springframework:spring-core:4.3.5.RELEASE',
'org.springframework:spring-aop:4.3.5.RELEASE'
compile(
[group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'],
[group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE']
)
testCompile('org.hibernate:hibernate-core:5.2.12.Final') {
transitive = true
}
runtime(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') {
transitive = false
}
}
上面代码通过不同的配置compile、testCompile、runtime进行依赖声明。有时需要依赖多个工件,我们也可以增加特定工件通过@extensionName(或ext方式):
runtime "org.codehaus.groovy:groovy-all:2.4.11@jar"
runtime group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.11', ext: 'jar'
这里我们使用@jar符合仅下载jar工件。
如果增加本地文件依赖,语法格式如下:
compile files('libs/joda-time-2.2.jar', 'libs/junit-4.12.jar')
compile fileTree(dir: 'libs', include: '*.jar')
如果需要避免传递依赖,可以在配置级别或依赖级别进行配置:
configurations {
testCompile.exclude module: 'junit'
}
testCompile("org.springframework.batch:spring-batch-test:3.0.7.RELEASE"){
exclude module: 'junit'
}
多项目构建
构建声明周期
初始化阶段,gradle决定哪些项目参与多项目构建。一般在settings.gradle文件中定义,其位于根项目中,gradle也创建参与项目的实例。
在配置阶段,在配置阶段,所有创建的项目实例都需要基于Gradle特性配置进行配置。
最后在执行阶段,一组被创建和配置的任务开始执行。我们能在settings.gradle 和 build.gradle 文件中增加这三个阶段的代码。
settings.gradle :
println 'At initialization phase.'
build.gradle :
println 'At configuration phase.'
task configured { println 'Also at the configuration phase.' }
task execFirstTest { doLast { println 'During the execution phase.' } }
task execSecondTest {
doFirst { println 'At first during the execution phase.' }
doLast { println 'At last during the execution phase.' }
println 'At configuration phase.'
}
创建多项目构建
我们可以在根目录中执行gradle init 命令创建两个文件框架:settings.gradle 和 build.gradle .
根构建脚本生成一些通用配置:
allprojects {
repositories {
mavenCentral()
}
}
subprojects {
version = '1.0'
}
setting文件中也需要博阿凯根项目和子项目:
rootProject.name = 'multi-project-builds'
include 'greeting-library','greeter'
现在我们需要有两个子项目文件夹来演示多项目构建:’greeting-library’,’greeter’。每个子项需要有各自的构建脚本来排至各自依赖和其他必要的配置。
如果greeter项目依赖greeting-library项目,我们需要在greeter构建脚本中包括相应依赖。
dependencies {
compile project(':greeting-library')
}
使用Gradle包装器
如果gradle项目有gradlew文件(linux为gradlew.sh,windows为gradlew.bat),我们不需要安装gradle去构建项目。
当执行gradlew构建项目(windows为 gradlew,linux为./gradlew),gradle特定发布包将被自动下载。通过下面脚本增加gradle包装器至项目中:
gradle wrapper --gradle-version 4.2.1
命令需要在根项目中执行,这将创建所有必要的文件和文件夹,以便将Gradle包装器与项目绑定在一起。另一种方法是将包装器任务添加到构建脚本中:
task wrapper(type: Wrapper) {
gradleVersion = '4.2.1'
}
执行包装器任务将把我们的项目与包装器绑定在一起。除了gradlew文件之外,在gradle文件夹中还会生成一个包装器文件夹,其中包含一个jar和一个属性文件。
如果要切换到新版本Gradle,我们只需要修改grad-wrapper.properties中的内容。
总结
本文我们了解Gradle,相比其他构件工具更强大的版本冲突及传递依赖管理。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/81711782