在过去一年左右,我开始使用Gradle作为我构建基于JVM项目的主要工具。 在使用Gradle之前,我是一个Apache Maven用户。 Gradle分别从Apache Maven和Apache Ant中汲取了优点。 Gradle从Ant中获取了灵活的特性,从Maven得到了配置,依赖关系管理和插件的基本规范。 Gradle和Ant一样,将任务作为一等公民对待。
Gradle构建有三个不同的阶段 – 初始化,配置和执行。 初始化阶段用来确定所有将参与构建过程的项目,并为每个项目创建一个Project实例。 在配置阶段,它会执行所有参与构建过程的项目的构建脚本。 最后,在执行阶段,所有在配置阶段配置好的任务都会被执行。
在本文中,我将列出我在过去一年左右学到的小技巧。
Contributing to Gradle tips
如果你看到错误或者可以做得更好的地方也请贡献你的一份力量!提个issue或是提交pull request给我都是可以的。欢迎各种贡献,包括更正,添加,改进和翻译。
Tip 1: 使用Gradle Wrapper
当我开始使用Gradle,其中一个功能——对包装脚本的支持使我印象深刻。 Gradle的wrapper将自己包含在项目中,独立于构建工具的安装。 它允许您以零配置方式用Gradle构建项目(无需先安装Gradle distribution)。 这将确保每个人都使用相同版本的构建工具。
要为项目创建Gradle wrapper脚本,可以运行以下命令:
$ gradle wrapper –gradle-version 2.14.1
你需要安装Gradle到你的电脑上以运行以上的命令(译者注:可能还要加环境变量)。如果你用的是Mac,你可以用brew安装gradle。
这将在你的工程里生成少许文件gradlew、gradlew.bat、 gradle/wrapper/gradle-wrapper.jar和gradle/wrapper/gradle-wrapper.properties。
确保没有在版本控制工具中忽略gradle-wrapper.jar文件。默认情况下版本控制会忽略.jar文件
在任何时候,如果你想升级Gradle版本只是重新生成Gradle wrapper脚本传递它要使用的Gradle版本。 假设我们要升级到Gradle 3.0-milestone-2,再次运行如下命令:
$ gradle wrapper –gradle-version 3.0-milestone-2
还有,为./gradlew设置一个别名也是个好主意
alias gradle=”./gradlew”
Tip 2: 查看依赖图表
要查看项目的依赖关系图,您可以运行以下命令:
$ gradle dependencies
Tip 3: 构建单独的工程
Gradle同时支持单一项目构建和多项目构建。我们假设我们的多项目结构如下所示:
app
api
model
rest
core
web
itests
只构建rest工程我们可以运行以下命令
$ gradle api:rest:build
Tip 4: 排除某些任务
你可以用-x选项去排除一个任务。假设我们希望跳过测试我们可以用以下的命令:
$ gradle clean build -x test
Tip 5: 分析你的构建
Gradle内置了对分析的支持。 如果您遇到性能问题,应该使用–profile选项来生成配置文件报告。 报告 会显示不同任务花费的时间。 假设我们想要分析构建任务,然后我们可以运行以下命令:
$ gradle –profile build
这将在目录build/reports/profile下生成报告。
gradle-profilegradle-profile
Tip 6: Perform dry run
有时你想要查看所有在编译中将被执行的所有任务担忧不想执行它们。这个场景下Gradle提供“–dry-run“`命令:
$ gradle build –dry-run
Tip 7: 安置项目jar包到本地Maven仓库
$ gradle install
Tip 8:查看Gradle任务
$ gradle tasks
这个命令并不会列出所有任务。要用–all来运行:
$ gradle tasks –all
Tip 9: 使用Gradle守护程序(Daemon)
加快Gradle构建的最简单办法就是用Gradle守护进程进行构建。Gradle守护进程是一个长时间存活的后台进程,在其生命周期内只执行一次引导。 默认情况下未启用Gradle守护程序。 要使用Gradle守护进程,您可以在构建命令中使用–daemon标志。
$ gradle build –daemon
它将在3.0版本默认开启
每次传递–daemon标志都很麻烦,因此您可以通过在开发机器上的~/.gradle/gradle.properties文件中添加此标志来启用它。
org.gradle.daemon=true
Tip 10: 多线程构建
打开~/.gradle/gradle.properties并添加以下行。
org.gradle.parallel=true
Tip 11: 自定义Gradle任务
您可以通过覆盖其doFirst和doLast生命周期方法来自定义任何Gradle任务。 让我们假设我们想在执行测试之前和之后添加打印语句,我们可以通过以下操作:
apply plugin:’java’
test.doFirst {
println(“running tests…”)
}
test.doLast {
println(“done executing tests…”)
}
Tip 12: 为Gradle守护进程提供JVM参数
您可以通过在~/.gradle/gradle.properties中输入一行来为Gradle守护程序指定JVM参数,如下所示:
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
Tip 13: 用离线模式运行
$ gradle build –offline
Tip 14: 按需配置
按需配置是Gradle的孵化功能,因此默认情况下不启用。
$ gradle clean build –configure-on-demand
如果您希望将其设置为默认选项,则可以通过向~/.gradle/gradle.properties中添加以下代码为全局提供此选项
org.gradle.configureondemand=true
Tip 15: 刷新Gradle依赖缓存
$ gradle clean build –refresh-dependencies
你也可以手动删除 ~/.gradle/caches.。下一次你构建的时候它会下载所有依赖并加入到缓存中。
假设你在Gradle中用于放置jar文件的目录为lib。
dependencies {
compile files(‘libs/myjar.jar’)
}
也能像下面这样做:
repositories {
flatDir {
dirs ‘libs’
}
}
dependencies {
compile name: ‘myjar’
}
Tip 17: 将本地目录中的所有jar加入依赖
如果你需要把一个目录下的所有libs加入依赖,那你就可以像下面这样做:
dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
}
Tip 18: 构建项目和所有它所依赖的项目
$ gradle api:model:buildNeeded
Tip 19: 构建项目和所有依赖它的
$ gradle api:rest:buildDependents
Tip 20: 为构建脚本提供默认任务
为项目定义默认任务是一个很好的做法,以便初次使用者可以轻松开始您的项目。 在您的Gradle脚本中,定义defaultTasks变量来传递它应该执行的任务。
defaultTasks “clean”,”build”
现在如果一个用户运行gradle命令,默认任务将被执行
Tip 21: 创建文件的校验和
apply plugin: ‘java’
archivesBaseName = ‘checksum-sample’
jar.doLast { task ->
ant.checksum file: task.archivePath
}
Tip 22: 给构建文件取不同的名字
默认的文件名为 build.gradle。你可以在settings.gradle用以下方法进行重命名:
rootProject.buildFileName = “gradle-tips.gradle”
现在把你的build.gradle改名成了gradle-tips.gradle
Tip 23: 在多项目Gradle工程中为构建脚本取不同的名字
为了方便,我们用build.gradle作为Gradle构建脚本的名称。当你在多项目Gradle工程中,对构建脚本使用不同的名称是有意义的。 我们假设我们的多模块项目如下所示:
app
api
core
web
itests
默认情况下,所有这些子项目都将build.gradle作为他们的Gradle构建文件。 我们可以通过在settings.gradle中改变。
rootProject.children.each {
it.buildFileName = it.name + ‘.gradle’
}
现在你可以用build.gradle作为根项目的构建文件而子工程中为api.gradle, core.gradle, web.gradle, 和itests.gradle。
Tip 24: 使用Gradle可视化界面
你可以在命令行中用以下代码启动Gradle可视化界面:
$ gradle –gui
它将开启下图所示的可视化界面:
gradle-guigradle-gui
Tip 25: 创建untar任务
task untar( type : Copy) {
from tarTree(‘dist.tar.gz’)
into ‘destFolder’
}
Tip 26: 版本冲突时的配置
在你的构建脚本中,定义了一个如下的配置块:
configurations {
compile.resolutionStrategy.failOnVersionConflict()
}
Tip 27: 在Gradle中使用作用域
你可以用gradle2.12版本以上提供的compileOnly作用域来使用Maven
dependencies {
compileOnly ‘javax.servlet:servlet-api:3.0-alpha-1’
}
Tip 28: 显式设置Java编译编码
在你的 build.gradle中添加如下代码:
compileJava.options.encoding = ‘UTF-8’
Tip 29: 禁用传递依赖关系解析
为整个配置关闭传递依赖关系:
configurations {
compile.transitive = false
}
Tip 30: 查看Gradle版本
用下列代码查看Gradle版本:
$ gradle -v
————————————————————
Gradle 2.14.1
————————————————————
Build time: 2016-07-18 06:38:37 UTC
Revision: d9e2113d9fb05a5caabba61798bdb8dfdca83719
Groovy: 2.4.4
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_60 (Oracle Corporation 25.60-b23)
OS: Mac OS X 10.10.5 x86_64
你可以用GradleVersion.current()查看当前Gradle版本。 你可以创建一个任务来做这个工作:
task gradleVersion {
group = “help”
description = “Prints Gradle version”
doLast {
logger.quiet(“You are using [${GradleVersion.current()}]”)
}
}
当你运行时你会看到:
$ gradle gradleVersion
:gradleVersion
You are using [Gradle 2.14.1]
BUILD SUCCESSFUL
Total time: 0.667 secs
Tip 31: 禁用一个任务
taskName.enabled = false
如果你想禁用测试任务,用下列代码:
test.enabled = false
Tip 32: 初始化Gradle项目
要创建使用testng测试框架的Java Gradle项目,您可以使用以下命令:
$ gradle init –type java-library –test-framework testng
如果你想用JUnit,那就别加上–test-framework
$ gradle init –type java-library
你也可以创建groovy和scala项目
$ gradle init –type scala-library
$ gradle init –type groovy-library
Tip 33: 签名文件
apply plugin: ‘signing’
signing {
sign configurations.archives
}
如果你只想在发布的版本中签名而在快照版本中不签名,那你可以这样做:
apply plugin: ‘signing’
signing {
required { !version.endsWith(“SNAPSHOT”) }
}
Tip 34: 并行运行测试
test {
maxParallelForks = 2
}
Tip 35: 为测试设置内存
test {
minHeapSize = ‘512m’
maxHeapSize = ‘1024m’
}
Tip 36: 用任务的短名
如果你有个任务buildServerDistribution,想用它的短名,你可以用如下方法:
$ gradle bSD
你必须保证它在所有任务中是唯一的,如有另一个任务buildSafeDistribution,你需要做以下区分
$ gradle bSeD
Tip 37: 查看Gradle任务的相关信息
$ gradle help –task <task name>
$ gradle help –task dependencies
Tip 38: 用调试模式运行Gradle
$ gradle clean build –debug
Tip 39: 当任务失败后继续执行任务
$ gradle clean build –continue
Tip 40: 将Maven工程转移至Gradle
到Maven项目中运行以下命令:
$ gradle init –type pom
Tip 41: 强制Gradle重运行即使它是最新的
$ gradle build –rerun-tasks
Tip 42: 在依赖中使用确切的版本号
你在声明依赖时不要使用+号,而该用确切的版本号,这回让你构建过程更快更安全
Tip 43: 启用连续构建
如果你希望连续地运行构建,那你可以使用–continuous标识。它将查找文件改变,找到一处九江重新运行命令,用下列方法启用连续测试:
$ gradle test –continuous
Tip 44: 运行一个测试事务
有时我们只需要运行一个测试事务而不是运行所有测试。用下列命令即可:
$ gradle test –tests tips.CalculatorTest
想运行CalculatorTest 中的某个部分可以这样做:
$ gradle test –tests tips.CalculatorTest.shouldAddTwoNumbers
您还可以使用正则表达式来指定多个测试:
$ gradle test –tests “tips.Calculator*Test”
你也可以多次用–test标识
$ gradle test –tests tips.CalculatorTest –tests tips.Calculator1Test
在一个子模块的测试中你可以这样做:
$ gradle api:test –tests app.api.PingResourceTest
Tip 45: 生成源文件和java文档jar包
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = ‘sources’
from sourceSets.main.allSource
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = ‘javadoc’
from javadoc.destinationDir
}
artifacts {
archives sourcesJar, javadocJar
}
Tip 46: 在构建脚本中访问环境变量
你可以用很多方法在构建脚本中访问环境变量:
println(System.getenv(“HOME”))
println(“$System.env.HOME”)
Tip 47: 配置测试日志
Gradle默认只会在控制台打印测试错误的日志。这会限制任务如何运行的可见性。Gradle允许你用testLogging参数来配置它。打印所有日志如下。更多信息看这里.
test {
testLogging {
events “passed”, “skipped”, “failed”
}
}
现在当你运行./gradlew clean build时,你也会看到通过测试的日志了。
$ gradle clean test
:clean
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
tips.CalculatorTest > shouldSubtractTwoNumbers PASSED
tips.CalculatorTest > shouldAddTwoNumbers PASSED
tips.CalculatorTest > shouldSubtractTwoNumbers1 PASSED
有一点要记住的是,Gradle测试命令只有当改变时才会执行。因此如果你在没有改动的情况下再次执行它将不会有任何结果产生。你将看到:test UP-TO-DATE ,这意味着没有检测到改动。你可以用./gradlew cleanTest test指令强制Gradle每次都运行测试。
Tip 48: 在测试执行期间显示标准输出和错误流
test {
testLogging {
events “passed”, “skipped”, “failed”
showStandardStreams = true
}
}
Tip 49: 存储凭据
您不应该在build.gradle中硬编码凭据,而应该依靠您的用户home~/ .gradle / gradle.properties来存储凭据。 假设你想使用受凭证保护的Maven存储库。 指定凭据的一种方法是在build.gradle中对它们进行硬编码,如下所示。
repositories {
maven {
credentials {
username “admin”
password “admin123”
}
url “http://nexus.mycompany.com/”
}
}
更好的方法是改变你自己的~/ .gradle / gradle.properties
nexusUsername = admin
nexusPassword = admin123
现在,在build.gradle中引用这个
repositories {
maven {
credentials {
username “$nexusUsername”
password “$nexusPassword”
}
url “http://nexus.mycompany.com/”
}
}
Tip 50: 调试Java可执行应用程序
如果将应用程序打包成可以通过Gradle运行的可执行jar,那么可以通过–debug-jvm选项来调试它。 Spring Boot应用程序作为可执行jar运行。 您可以使用gradle bootRun来运行应用程序。 要在端口5005上调试应用程序,您可以在调试模式下启动应用程序。
$ gdw <taskname> –debug-jvm
$ gradle bootRun –debug-jvm
Tip 51: 使用本地Maven仓库
要用本地 ~/.m2 仓库,你需要在build.gradle中添加这些:
repositories {
mavenLocal()
}
Tip 52: 排除传递性的依赖
用下述方法排除传递性的依赖
compile(‘org.hibernate:hibernate:3.1’) {
exclude module: ‘cglib’ //by artifact name
exclude group: ‘org.jmock’ //by group
}