Gradle User Guide 中文版 (中文版)
User Manual:
Open the PDF directly: View PDF .
Page Count: 84
1. 介绍
2. 概述
i. 特点
ii. 为什么用Groovy?
3. 教程
i. 入门
4. 安装Gradle
i. 先决条件
ii. 下载
iii. 解压缩
iv. 环境变量
v. 运行并测试您的安装
vi. JVM选项
5. 排除故障
i. 解决遇到的问题
ii. 获得帮助
6. 构建脚本基础知识
i. Projects和tasks
ii. Helloworld
iii. 快捷的任务定义
iv. 构建脚本代码
v. 任务依赖
vi. 动态任务
vii. 使用已经存在的任务
viii. 快捷注释
ix. 附加的task属性
x. 使用Ant任务
xi. 使用方法
xii. 默认任务
xiii. 通过DAG配置
7. Java快速入门
i. Java插件
ii. 一个基础的Java项目
i. 建立项目
ii. 外部的依赖
iii. 定制项目
iv. 发布JAR文件
v. 创建Eclipse项目
vi. 总结
iii. 多项目的Java构建
i. 定义一个多项目构建
ii. 通用配置
iii. 项目之间的依赖
iv. 创建一个发行版本
8. 依赖管理的基础知识
i. 什么是依赖管理
ii. 声明你的依赖
iii. 依赖配置
iv. 外部的依赖
v. 仓库
vi. 发布artifacts
9. Groovy快速入门
TableofContents
i. 一个基本的Groovy项目
ii. 总结
10. 网页应用快速入门
i. 构建一个WAR文件
ii. 运行Web应用
iii. 总结
11. 使用Gradle命令行
i. 多任务调用
ii. 排除任务
iii. 失败后继续执行构建
iv. 简化任务名
v. 选择文件构建
vi. 获取构建信息
i. 项目列表
ii. 任务列表
iii. 获取任务具体信息
iv. 获取依赖列表
v. 查看特定依赖
vi. 获取项目属性列表
vii. Profilingabuild
12. UsingtheGradleGraphicalUserInterface
13. WritingBuildScripts
14. Tutorial-'ThisandThat'
15. MoreaboutTasks
16. WorkingWithFiles
i. Locatingfiles
ii. Filecollections
特点
为什么用Groovy?
概述
这里简述下Gradle的特点.
1.声明式构建和合约构建
Gradle的核心是基于Groovy的领域特定语言(DSL),具有十分优秀的扩展性.Gradle通过提供可以随意集成的声明式语言
元素将声明性构建推到了一个新的高度.这些元素还提供了对Java,Groovy,OSGi,网络和Scala等项目的支持.而且,基于这
种声明式语言的可扩展性.你可以添加自己的语言元素或加强现有的语言元素,从而提供简洁,易于维护和易于理解的构建.
2.基于依赖的编程语言
声明式语言位于通用任务图(generalpurposetaskgraph)的顶端,它可以被充分利用在你的构建中.它具有强大的灵活性,
可以满足使用者对Gradle的一些特别的需求.
3.让构建结构化
Gradle的易适应性和丰富性可让你在构建里直接套用通用的设计原则.例如,你可以非常容易容易的使用一些可重用的组件来
构成你的构建.Inlinestuffwhereunnecessaryindirectionswouldbeinappropriate.不要强行分离已经结合在一起的部分(例
如,在你的项目层次结构中).避免使构建难以维护.总之,你可以创建一个结构良好,易于维护,易于理解的构建.
4.API深化
你会非常乐意在整个构建执行的生命周期中使用Gradle,因为Gradle允许你管理和定制它的配置和执行行为.
5.Gradlescales
Gradlescalesverywell.不管是简单的独立项目还是大型的多项目构建,它都能显著的提高效率.它不仅可以提供最先进的构
建功能,还可以解决许多大公司碰到的构建性能低下的问题.
6.多项目构建
Gradle对多项目的支持是非常出色的.它允许你模拟在多项目构建中项目的关系,这正是你所要关注的地方.Gradle遵从你
的布局而是去违反它.
Gradle提供了局部构建的功能.如果你构建一个单独的子项目,Gradle会构建这个子项目依赖的所有子项目.你也可以选择依
赖于另一个特别的子项目重新构建这些子项目.这样在一些大型项目里就可以节省非常多的时间.
7.多种方式来管理你的依赖
不同的团队有不同的管理外部依赖的方法.Gradle对于任何管理策略都提供了合适的支持.从远程Maven和Ivy库的依赖管
理到本地文件系统的jars或者dirs.
8.Gradle是第一个构建整合工具
Anttasksarefirstclasscitizens.Evenmoreinteresting,Antprojectsarefirstclasscitizensaswell.Gradleprovidesadeep
importforanyAntproject,turningAnttargetsintonativeGradletasksatruntime.YoucandependonthemfromGradle,
youcanenhancethemfromGradle,youcanevendeclaredependenciesonGradletasksinyourbuild.xml.Thesame
integrationisprovidedforproperties,paths,etc...
GradlefullysupportsyourexistingMavenorIvyrepositoryinfrastructureforpublishingandretrievingdependencies.Gradle
alsoprovidesaconverterforturningaMavenpom.xmlintoaGradlescript.RuntimeimportsofMavenprojectswillcome
soon.
9.易于迁移
Gradlecanadapttoanystructureyouhave.ThereforeyoucanalwaysdevelopyourGradlebuildinthesamebranch
特点
whereyourproductionbuildlivesandbothcanevolveinparallel.Weusuallyrecommendtowriteteststhatmakesurethat
theproducedartifactsaresimilar.Thatwaymigrationisaslessdisruptiveandasreliableaspossible.Thisisfollowingthe
best-practicesforrefactoringbyapplyingbabysteps.
10.Groovy
Gradle'sbuildscriptsarewritteninGroovy,notXML.Butunlikeotherapproachesthisisnotforsimplyexposingtheraw
scriptingpowerofadynamiclanguage.Thatwouldjustleadtoaverydifficulttomaintainbuild.ThewholedesignofGradle
isorientedtowardsbeingusedasalanguage,notasarigidframework.AndGroovyisourgluethatallowsyoutotellyour
individualstorywiththeabstractionsGradle(oryou)provide.Gradleprovidessomestandardstoriesbuttheyarenot
privilegedinanyform.Thisisforusamajordistinguishingfeaturescomparedtootherdeclarativebuildsystems.Our
Groovysupportisalsonotjustsomesimplecoatingsugarlayer.ThewholeGradleAPIisfullygroovynized.Onlybythat
usingGroovyisthefunandproductivitygainitcanbe.
10.TheGradlewrapper
TheGradleWrapperallowsyoutoexecuteGradlebuildsonmachineswhereGradleisnotinstalled.Thisisusefulfor
exampleforsomecontinuousintegrationservers.Itisalsousefulforanopensourceprojecttokeepthebarrierlowfor
buildingit.Thewrapperisalsoveryinterestingfortheenterprise.Itisazeroadministrationapproachfortheclient
machines.ItalsoenforcestheusageofaparticularGradleversionthusminimizingsupportissues.
11.免费和开源
Gradle是一个开源项目,遵循ASL许可.
我们认为在脚本构建时,内部基于XML的DSL(基于一个动态语言)优势是巨大的.有许多动态语言在那里,我们为什么选择
Groovy?答案在于Gradle的运行环境.虽然Gradle是以一个多用途的构建工具为核心,它的重点是Java项目.在这样的项目
中,显然团队每个成员都了解Java.我们认为构建应尽可能对所有团队成员都是透明的,所以选择了Groovy.
你可能会说,为什么不直接使用Java作为构建脚本的语言.我们认为这是一个有效性的问题.对于你的团队,它要有最高的透
明度和最低的学习曲线,也就是说容易掌握.但由于Java的限制,这样的构建语言不会那么完美和强大.如Python,Groovy
或Ruby语言都可以有更高的效率.我们选择了Groovy是因为它给Java开发人员提供了迄今为止最大的透明度.其基本的符
号和类型与Java是一样的,其封装结构和许多其他的地方也是如此.
对于那些同样分享Python或Ruby知识的Java团队将会很乐意学习它.Gradle的设计非常适合在JRuby和Jython中创建
另一个构建脚本引擎.它只是目前开发的优先级里.我们十分支持任何人来做贡献,创建额外的构建脚本引擎.
为什么用Groovy?
入门
教程
接下来的教程讲先介绍Gradle的基础知识
描述如何安装Gradle.
介绍脚本构建的基础元素:projects和tasks.
展示如何开始使用Gradle的合约构建来构建Java项目.
展示如何开始使用Gradle的依赖管理.
使用Gradle的合约构建来构建Groovy项目.
使用Gradle的合约构建来构建网页应用项目.
入门
Chapter3,安装Gradle
Chapter5,脚本构建基础
Chapter6,Java快速入门
Chapter7,依赖管理基础
Chapter8,Groovy快速入门
Chapter9,网页应用快速入门
先决条件
下载
解压缩
环境变量
运行并测试您的安装
JVM选项
安装Gradle
Gradle需要安装一个JavaJDK或者JRE.Java版本必须至少是6以上.Gradle自带Groovy库,所以没必要安装Groovy.任
何已经安装的Groovy会被Gradle忽略.
Gradle使用任何存在在你的路径中的JDK(可以通过java-version检查).或者,你可以设置JAVA_HOME环境参数来指定希
望使用的JDK的安装目录.
先决条件
Gradle发布的版本为ZIP格式.所有文件包含:
Gradle二进制文件.
用户指南(HTML和PDF).
DSL参考指南.
API文档(Javadoc和Groovydoc).
扩展的例子,包括用户指南中引用的实例,以及一些完整的以及更复杂的build来帮助用户构建自己的build.
二进制源码.此代码仅供参考.如果你想要构建Gradle你需要下载发布的源代码或者提取代码库中的源代码.请参考官方网
站获得具体的信息.
解压缩
为了运行Gradle,添加GRADLE_HOME/bin到您的PATH环境变量中.通常,这样已经足够运行Gradle了.
这里的GRADLE_HOME是Gradle的安装路径.
环境变量
您可以通过gradle命令来运行Gradle.通过gradle-v命令来检测Gradle是否已经正确安装.如果正确安装,会输出Gradle版
本信息以及本地的配置环境(groovy和JVM版本等).显示的版本信息应该与您所下载的gradle版本信息相匹配.
运行并测试您的安装
JVM选项可以通过设置环境变量来更改.您可以使用GRADLE_OPTS或者JAVA_OPTS.根据惯例,JAVA_OPTS是一个用
于JAVA应用的环境变量.一个典型的用例是在JAVA_OPTS里设置HTTP代理服务器(proxy),在GRADLE_OPTS这是内存
选项.这些变量也可以在gradle的一开始就设置或者通过gradlew脚本.
JVM选项
当使用Gradle时,你肯定会碰到许多问题.你也许不知道如果使用一个特别的功能,或者你碰到了一个BUG.或者,你只是有
一些关于使用yGradle的问题.
这一章给出了一些简单的建议并解释了如何解决你的问题.
排除故障
如果你碰到了问题,首先要确定你使用的是最新版本的Gradle.我们会经常发布新版本,解决一些bug并加入新的功能.所以
你遇到的问题可能就在新版本里解决了.
如果你正在使用GradleDaemon,先暂时关闭daemon(你可以使用switch--no-daemon命令).在第19章我们可以了解到更
多关于daemon的信息.
解决遇到的问题
Projects和tasks
Helloworld
快捷的任务定义
构建脚本代码
任务依赖
动态任务
使用已经存在的任务
快捷注释
附加的task属性
使用Ant任务
使用方法
默认的任务
通过DAG配置
构建脚本基础知识
Gradle里的任何东西都是基于这两个基础概念:projects(项目)和tasks(任务).
每一个Gradle构建都是由一个或多个projects构成的.一个project到底代表什么依赖于你想用Gradle做什么.举个例子,一
个project也许代表一个JAR或者一个网页应用.它也可能代表一个发布的ZIP压缩包,这个ZIP可能是由许多其他项目的
JARs构成的.一个project不必要代表要被构建的某个东西.它可以代表一件要做的事,比如布署你的应用.不要担心现在这些
说明看上去有一点模糊.Gradle的合约构建的支持加入了一个更加具体的关于project的定义.
每一个project是由一个或多个tasks构成的.一个task代表一些更加细化的构建.可能是编译一些classes,创建一个JAR,生
成javadoc,或者生成莫个目录的压缩文件.
目前,我们将关注定义构建里的一些简单的tasks.以后的章节会关注与多项目构建以及如果通过projects和tasks工作.
Projects和tasks
您通过gradle命令运行一个Gradle构建.gradle命令会在当前目录查找一个叫build.gradle的文件.我们称这个
build.gradle文件为一个构建脚本(buildscript),虽然严格来说它是一个构建配置脚本(buildconfigurationscript).这个脚本定
义了一个project和它的tasks.
让我们来试一试,创建一个名为build.gradle的构建脚本.
Example6.1.第一个构建脚本
build.gradle
taskhello{
doLast{
println'Helloworld!'
}
}
在命令行里,进入包含的文件夹然后通过gradle-qhello执行构建脚本:
gradle-qhello的输出
>gradle-qhello
Helloworld!
这里发生了什么?这个构建脚本定义了一个单独的task,叫做hello,并且加入了一个action.当你运行gradlehello,Gradle
执行叫做hello的task,也就是执行了你所提供的action.这个action是一个包含一些Groovy代码的闭包(closure这个概念
不清楚的同学好好谷歌下).
如果你认为这些看上去和Ant的targets很想象,好吧,你是对的.Gradletasks和Ant的targets是对等的.但是你也会看到,
他们是更加强力的.我们使用一个不同于Ant的术语task,看上去比target更加能直白.不幸的是这个带来了一个术语冲突,
因为Ant称它的命令,比如javac或者copy,叫tasks.所以当我们谈论tasks,是指Gradle的tasks.如果我们能讨论Ant的
tasks(Ant命令),我们会直接称呼anttask.
补充一点命令里的-q是干什么的?
这个指南里绝大多说的例子会在命令里加入-q.它取缔了Gradle的日志信息(logmessages),所以用户只能看到tasks的输
出.它例子的输出更加清晰.你并不一定需要加入这个选项.参考第18章,日志的Gradle影响输出的详细信息.
Helloworld
有一种比我们之前定义的hello任务更简明的方法
*Example6.3.快捷的任务定义
build.gradle*
taskhello<<{
println'Helloworld!'
}
再一次,它定义一个叫做hello的任务,这个任务是一个可以执行的闭包.我们将使用这种方式来定义这本指南里所有的任务.
快捷的任务定义
Gradle的构建脚本展示给你Groovy的所有能力.作为开胃菜,来看看这个:
Example6.4.在Gradle任务里使用Groovy
build.gradle
taskupper<<{
StringsomeString='mY_nAmE'
println"Original:"+someString
println"Uppercase:"+someString.toUpperCase()
}
gradle-qupper命令的输出
>gradle-qupper
Original:mY_nAmE
Uppercase:MY_NAME
或者
Example6.5.在Gradle任务里使用Groovy
build.gradle
taskcount<<{
4.times{print"$it"}
}
gradle-qcount命令的输出
>gradle-qcount
0123
构建脚本代码
就像你所猜想的那样,你可以申明任务之间的依赖关系.
Example6.6.申明任务之间的依赖关系
build.gradle
taskhello<<{
println'Helloworld!'
}
taskintro(dependsOn:hello)<<{
println"I'mGradle"
}
gradle-qintro命令的输出
>gradle-qintro
Helloworld!
I'mGradle
再加入一个依赖之前,这个依赖的任务不需要提前定义了,来看下面的例子.
Example6.7.LazydependsOn-其他的任务还没有存在
build.gradle
tasktaskX(dependsOn:'taskY')<<{
println'taskX'
}
tasktaskY<<{
println'taskY'
}
gradle-qtaskX命令的输出
>gradle-qtaskX
taskY
taskX
taskX到taskY的依赖在taskY被定义之前就已经申明了.对于我们之后讲到的多任务构建是非常重要的.任务依赖将会在
14.4具体讨论.
请注意你不能使用快捷注释(参考5.8,“快捷注释”)当所关联的任务还没有被定义.
任务依赖
Groovy不仅仅被用来定义一个任务可以做什么.举个例子,你可以使用它来动态的创建任务.
Example6.8.动态的创建一个任务
build.gradle
4.times{counter->
task"task$counter"<<{
println"I'mtasknumber$counter"
}
}
gradle-qtask1命令的输出
>gradle-qtask1
I'mtasknumber1
动态任务
当任务创建之后,它可以通过API来访问.这个和Ant不一样.举个例子,你可以创建额外的依赖.
Example6.9.通过API访问一个任务-加入一个依赖
build.gradle
4.times{counter->
task"task$counter"<<{
println"I'mtasknumber$counter"
}
}
task0.dependsOntask2,task3
gradle-qtask0命令的输出
>gradle-qtask0
I'mtasknumber2
I'mtasknumber3
I'mtasknumber0
或者你可以给一个已经存在的任务加入行为.
Example6.10.通过API访问一个任务-加入行为
build.gradle
taskhello<<{
println'HelloEarth'
}
hello.doFirst{
println'HelloVenus'
}
hello.doLast{
println'HelloMars'
}
hello<<{
println'HelloJupiter'
}
gradle-qhello命令的输出
>gradle-qhello
HelloVenus
HelloEarth
HelloMars
HelloJupiter
doFirst和doLast可以被执行许多次.他们可以在任务动作列表的开始和结束加入动作.当任务执行的时候,在动作列表里的动
作将被按顺序执行.<<操作符是doLast的简单别称.
使用已经存在的任务
正如同你已经在之前的示例里看到的,有一个方便的注释可以访问一个存在的任务.每个任务可以作为构建脚本的属性:
Example6.11.当成构建脚本的属性来访问一个任务
build.gradle
taskhello<<{
println'Helloworld!'
}
hello.doLast{
println"Greetingsfromthe$hello.nametask."
}
gradle-qhello命令的输出
>gradle-qhello
Helloworld!
Greetingsfromthehellotask.
这里的name是任务的默认属性,代表当前任务的名字,这里是hello
这使得代码易于读取,特别是当使用了由插件(如编译)提供的任务时尤其如此.
快捷注释
你可以给任务加入你自己的属性.为了加入一个myProperty属性,设置一个初始值给ext.myProperty.从这一点上来说,该属
性可以读取和设置像一个预定义的任务属性.
Example6.12.给任务加入额外的属性
build.gradle
taskmyTask{
ext.myProperty="myValue"
}
taskprintTaskProperties<<{
printlnmyTask.myProperty
}
gradle-qprintTaskProperties命令的输出
>gradle-qprintTaskProperties
myValue
给任务加额外的属性是没有限制的.你可以在13.4.2,“额外属性”里获得更多的信息.
附加的task属性
Ant任务是Gradle的一等公民.Gradle通过Groovy出色的集成了Ant任务.Groovy和AntBuilder装在在一起.相比于使用
Ant任务从一个build.xml文件,在Gradle里使用Ant任务是为方便和强大.从下面的例子中,你可以学习如何执行Ant任务以
及如何访问ant属性:
Example6.13.使用AntBuilder来执行ant.loadfile任务
build.gradle
taskloadfile<<{
deffiles=file('../antLoadfileResources').listFiles().sort()
files.each{Filefile->
if(file.isFile()){
ant.loadfile(srcFile:file,property:file.name)
println"***$file.name***"
println"${ant.properties[file.name]}"
}
}
}
gradle-qloadfile命令的输出
>gradle-qloadfile
***agile.manifesto.txt***
Individualsandinteractionsoverprocessesandtools
Workingsoftwareovercomprehensivedocumentation
Customercollaborationovercontractnegotiation
Respondingtochangeoverfollowingaplan
***gradle.manifesto.txt***
使不可能成为可能,使可能更加简单,使简单更加优雅.
使用Ant任务
Gradle能很好地衡量你规划构建逻辑的能力.首先衡量的是如何提取一个方法.
*Example6.14.使用方法规划你的构建逻辑
build.gradle*
taskchecksum<<{
fileList('../antLoadfileResources').each{Filefile->
ant.checksum(file:file,property:"cs_$file.name")
println"$file.nameChecksum:${ant.properties["cs_$file.name"]}"
}
}
taskloadfile<<{
fileList('../antLoadfileResources').each{Filefile->
ant.loadfile(srcFile:file,property:file.name)
println"I'mfondof$file.name"
}
}
File[]fileList(Stringdir){
file(dir).listFiles({file->file.isFile()}asFileFilter).sort()
}
adle-qloadfile命令的输出
>gradle-qloadfile
I'mfondofagile.manifesto.txt
I'mfondofgradle.manifesto.txt
稍后你看到,这种方法可以在多项目构建的子项目之间共享.如果你的构建逻辑变得更加复杂,Gradle为你提供了其他非常方
便的方法.请参见第59章,组织构建逻辑。
使用方法
Gradle允许你定义一个或多个默认任务.
Example6.15.定义一个默认任务
build.gradle
defaultTasks'clean','run'
taskclean<<{
println'DefaultCleaning!'
}
taskrun<<{
println'DefaultRunning!'
}
taskother<<{
println"I'mnotadefaulttask!"
}
gradle-q命令的输出
>gradle-q
DefaultCleaning!
DefaultRunning!
等价于gradlecleanrun.在一个多项目构建中,每一个子项目都可以有它特别的默认任务.如果一个子项目没有特别的默认
任务,父项目的默认任务将会被执行.
默认任务
正如我们之后的详细描述(参见第55章,构建的生命周期),Gradle有一个配置阶段和执行阶段.在配置阶段后,Gradle将会知
道应执行的所有任务.Gradle为你提供一个"钩子",以便利用这些信息.举个例子,判断发布的任务是否在要被执行的任务当中.
根据这一点,你可以给一些变量指定不同的值.
在接着的例子中,distribution任务和release任务将根据变量的版本产生不同的值.
Example6.16.根据选择的任务产生不同的输出
build.gradle
taskdistribution<<{
println"Webuildthezipwithversion=$version"
}
taskrelease(dependsOn:'distribution')<<{
println'Wereleasenow'
}
gradle.taskGraph.whenReady{taskGraph->
if(taskGraph.hasTask(release)){
version='1.0'
}else{
version='1.0-SNAPSHOT'
}
}
gradle-qdistribution命令的输出
>gradle-qdistribution
Webuildthezipwithversion=1.0-SNAPSHOT
Outputofgradle-qrelease
>gradle-qrelease
Webuildthezipwithversion=1.0
Wereleasenow
最重要的是whenReady在release任务执行之前就已经影响了release任务.甚至release任务不是首要任务(i.e.,首要任务
是指通过gradle命令的任务).
通过DAG配置
Java插件
一个基础的Java项目
多项目的Java构建
Java快速入门
正如我们已经看到的,Gradle是一种多种用途的构建工具.它可以在你的构建脚本里构建你在意的许多东西.然而,除非你在
构建脚本里加入代码,不然它什么都不会执行.
大都数Java项目是非常相像的:你需要编译你的Java源文件,运行一些单元测试,同时创建一个包含你类文件的JAR.如果
你不需要为每一个项目重复编写这些,我想你会非常乐意的.幸运的是,你现在不再需要了.Gradle通过使用插件解决了这个问
题.一个插件是Gradle的一个扩展,它会通过某种方式配置你的项目,典型的有加入一些预配置任务.Gradle装载了许多插件,
你也可以很简单地编写自己的插件并和其他开发者分享它.Java插件就是一个这样的插件.这个插件在你的项目里加入了许多
任务,这些任务会编译和Th单元测试你的源文件,并且把它们集成都一个JAR文件里.
Java插件是基于合约的.这意味着插件给项目的许多方面定义了默认的值,比如Java源文件在哪里.如果你在项目里遵从这
些合约,你通常不需要在你的构建脚本里加入太多东西.如果你不想要或者是你不能遵循合约,Gradle允许你自己定制你的项
目.事实上,因为对Java项目的支持是通过插件实现的,如果你不想要的话你一点也不需要使用这个插件来构建你的.
在后面的章节,我们有许多能让你深入了解Java插件,依赖管理和多项目构建的例子很多例子.在本章中,我们想给你一个如
何使用Java插件来构建一个Java项目的初步认识。
Java插件
让我们来看一个简单的例子.加入下面的代码来使用Java插件:
例子6.1.使用Java插件
build.gradle
applyplugin:'java'
这个例子的代码可以在samples/java/quickstart里找到,二进制代码和源代码里都包含这些文件.它将会把Java插件加入到
你的项目中,这意味着许多任务被自动的加入到了你的项目里.
Gradle希望能在src/main/java找到你的源代码,在src/test/java找到你的测试代码.另外,任何在src/main/resources的文件
都将被包含在JAR文件里,同时任何在src/test/resources的文件会被加入到classpath中以运行测试代码.所有的输出文件
将会被创建在构建目录里,JAR文件存放在build/libs文件夹里.
都有什么可以执行的任务呢?
你可以使用**gradletasks来列出项目的所有任务to.通过这个命令来尝试看看Java插件都在你的项目里加入了哪些命令吧.
一个基础的Java项目
Java插件在你的项目里加入了许多任务.然而,你只会用到其中的一小部分任务.最常用的任务是build任务,它会建立你的项
目.当你运行gradlebuild命令时,Gradle将编译和测试你的代码,并且创建一个包含类和资源的JAR文件:
Example7.2.建立一个Java项目
gradlebuild命令的输出
>gradlebuild
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILDSUCCESSFUL
Totaltime:1secs
其余一些有用的任务是:
clean
删除build生成的目录和所有生成的文件.
assemble
编译并打包你的代码,但是并不运行单元测试.其他插件会在这个任务里加入更多的东西.举个例子,如果你使用War插件,这
个任务将根据你的项目生成一个WAR文件.
check
编译并测试你的代码.其他的插件会加入更多的检查步骤.举个例子,如果你使用checkstyle插件,这个任务将会运行
Checkstyle来检查你的代码.
建立项目
通常,一个Java项目将有许多外部的依赖,既是指外部的JAR文件.为了在项目里引用这些JAR文件,你需要告诉Gradle去
哪里找它们.在Gradle中,JAR文件位于一个仓库中,这里的仓库类似于MAVEN的仓库.仓库可以被用来提取依赖,或者放
入一个依赖,或者两者皆可.举个例子,我们将使用开放的Maven仓库:
例子6.3.加入Maven仓库
build.gradle
repositories{
mavenCentral()
}
接下来让我们加入一些依赖.这里,我们假设我们的项目在编译阶段有一些依赖:
例子6.4.加入依赖
build.gradle
dependencies{
compilegroup:'commons-collections',name:'commons-collections',version:'3.2'
testCompilegroup:'junit',name:'junit',version:'4.+'
}
你可以在第7章里看到更多这方面的内容.
外部的依赖
Java插件给项目加入了一些属性(propertiy).这些属性已经被定义了默认的值,已经足够来开始构建项目了.如果你认为不合
适,改变它们的值也是很简单的.让我们看下这个例子.这里我们将指定Java项目的版本号,以及我们所使用的Java的版本.
我们同样也加入了一些属性在jar的清单里.
例子6.5.定制MANIFEST.MF文件
build.gradle
sourceCompatibility=1.5
version='1.0'
jar{
manifest{
attributes'Implementation-Title':'GradleQuickstart','Implementation-Version':version
}
}
Java插件加入的任务是常规性的任务,准确地说,就如同它们在构建文件里声明地一样.这意味着你可以使用任务之前的章节
提到的方法来定制这些任务T.举个例子,你可以设置一个任务的属性,在任务里加入行为,改变任务的依赖,或者完全重写一个
任务,我们将配置一个测试任务,当测试执行的时候它会加入一个系统属性:
例子6.6.测试阶段加入一个系统属性
build.gradle
test{
systemProperties'property':'value'
}
哪些属性是可用的?
你可以使用gradleproperties命令来列出项目的所有属性.这样你就可以看到Java插件加入的属性以及它们的默认值.
定制项目
通常JAR文件需要在某个地方发布.为了完成这一步,你需要告诉Gradle哪里发布JAR文件.在Gradle里,生成的文件比如
JAR文件将被发布到仓库里.在我们的例子里,我们将发布到一个本地的目录.你也可以发布到一个或多个远程的地点.
Example7.7.发布JAR文件
build.gradle
uploadArchives{
repositories{
flatDir{
dirs'repos'
}
}
}
运行gradleuploadArchives命令来发布JAR文件.
发布JAR文件
为了把你的项目导入到Eclipse,你需要加入另外一个插件:
Example7.8.Eclipse插件
build.gradle
applyplugin:'eclipse'
现在运行gradleeclipse命令来生成Eclipse的项目文件.Eclipse任务将在第38章,Eclipse插件里详细讨论.
创建Eclipse项目
下面是一个完整的构建文件的样本:
Example7.9.Java例子-完整的构建文件
build.gradle
applyplugin:'java'
applyplugin:'eclipse'
sourceCompatibility=1.5
version='1.0'
jar{
manifest{
attributes'Implementation-Title':'GradleQuickstart','Implementation-Version':version
}
}
repositories{
mavenCentral()
}
dependencies{
compilegroup:'commons-collections',name:'commons-collections',version:'3.2'
testCompilegroup:'junit',name:'junit',version:'4.+'
}
test{
systemProperties'property':'value'
}
uploadArchives{
repositories{
flatDir{
dirs'repos'
}
}
}
总结
现在让我们看一个典型的多项目构建.下面是项目的布局:
Example7.10.多项目构建-分层布局
构建布局
multiproject/
api/
services/webservice/
shared/
注意:这个例子的代码可以在samples/java/multiproject里找到.
现在我们能有三个项目.项目的应用程序接口(API)产生一个JAR文件,这个文件将提供给用户,给用户提供基于XML的网络
服务.项目的网络服务是一个网络应用,它返回XML.shared目录包含被api和webservice共享的代码.
多项目的Java构建
为了定义一个多项目构建,你需要创建一个设置文件(settingsfile).设置文件放在源代码的根目录,它指定要包含哪个项目.它
的名字必须叫做settings.gradle.在这个例子中,我们使用一个简单的分层布局.下面是对应的设置文件:
Example7.11.多项目构建-settings.gradlefile
settings.gradle
include"shared","api","services:webservice","services:shared"
在第56章.多项目构建,你可以找到更多关于设置文件的信息.
定义一个多项目构建
对于绝大多数多项目构建,有一些配置对所有项目都是常见的或者说是通用的.在我们的例子里,我们将在根项目里定义一个
这样的通用配置,使用一种叫做配置注入的技术(configurationinjection).这里,根项目就像一个容器,subprojects方法遍历这
个容器的所有元素并且注入指定的配置.通过这种方法,我们可以很容易的定义所有档案和通用依赖的内容清单:
Example7.12.多项目构建-通用配置
build.gradle
subprojects{
applyplugin:'java'
applyplugin:'eclipse-wtp'
repositories{
mavenCentral()
}
dependencies{
testCompile'junit:junit:4.11'
}
version='1.0'
jar{
manifest.attributesprovider:'gradle'
}
}
注意我们例子中,Java插件被应用到了每一个子项目中plugintoeach.这意味着我们前几章看到的任务和属性都可以在子项
目里被调用.所以,你可以通过在根目录里运行gradlebuild命令编译,测试,和JAR所有的项目.
通用配置
你可以在同一个构建里加入项目之间的依赖,举个例子,一个项目的JAR文件被用来编译另外一个项目.在api构建文件里我
们将加入一个由shared项目产生的JAR文件的依赖.由于这个依赖,Gradle将确保shared项目总是在api之前被构建.
Example7.13.多项目构建-项目之间的依赖
api/build.gradle
dependencies{
compileproject(':shared')
}
项目之间的依赖
(该章需加入更多内容。。。原稿写的太简单了)我们同时也加入了一个发行版本,将会送到客户端:
Example7.14.多项目构建-发行文件
api/build.gradle
taskdist(type:Zip){
dependsOnspiJar
from'src/dist'
into('libs'){
fromspiJar.archivePath
fromconfigurations.runtime
}
}
artifacts{
archivesdist
}
创建一个发行版本
什么是依赖管理
声明你的依赖
依赖配置
外部的依赖
仓库
发布artifacts
依赖管理的基础知识
Veryroughly,dependencymanagementismadeupoftwopieces.Firstly,Gradleneedstoknowaboutthethingsthatyour
projectneedstobuildorrun,inordertofindthem.Wecalltheseincomingfilesthedependenciesoftheproject.Secondly,
Gradleneedstobuildanduploadthethingsthatyourprojectproduces.Wecalltheseoutgoingfilesthepublicationsofthe
project.Let'slookatthesetwopiecesinmoredetail:
Mostprojectsarenotcompletelyself-contained.Theyneedfilesbuiltbyotherprojectsinordertobecompiledortestedand
soon.Forexample,inordertouseHibernateinmyproject,IneedtoincludesomeHibernatejarsintheclasspathwhenI
compilemysource.Torunmytests,Imightalsoneedtoincludesomeadditionaljarsinthetestclasspath,suchasa
particularJDBCdriverortheEhcachejars.
Theseincomingfilesformthedependenciesoftheproject.Gradleallowsyoutotellitwhatthedependenciesofyour
projectare,sothatitcantakecareoffindingthesedependencies,andmakingthemavailableinyourbuild.The
dependenciesmightneedtobedownloadedfromaremoteMavenorIvyrepository,orlocatedinalocaldirectory,ormay
needtobebuiltbyanotherprojectinthesamemulti-projectbuild.Wecallthisprocessdependencyresolution.
Often,thedependenciesofaprojectwillthemselveshavedependencies.Forexample,Hibernatecorerequiresseveral
otherlibrariestobepresentontheclasspathwithitruns.So,whenGradlerunsthetestsforyourproject,italsoneedsto
findthesedependenciesandmakethemavailable.Wecallthesetransitivedependencies.
Themainpurposeofmostprojectsistobuildsomefilesthataretobeusedoutsidetheproject.Forexample,ifyourproject
producesajavalibrary,youneedtobuildajar,andmaybeasourcejarandsomedocumentation,andpublishthem
somewhere.
Theseoutgoingfilesformthepublicationsoftheproject.Gradlealsotakescareofthisimportantworkforyou.Youdeclare
thepublicationsofyourproject,andGradletakecareofbuildingthemandpublishingthemsomewhere.Exactlywhat
"publishing"meansdependsonwhatyouwanttodo.Youmightwanttocopythefilestoalocaldirectory,oruploadthemto
aremoteMavenorIvyrepository.Oryoumightusethefilesinanotherprojectinthesamemulti-projectbuild.Wecallthis
processpublication.
什么是依赖管理?
让我们看一下一些依赖的声明.下面是一个基础的构建脚本:
例子7.1.声明依赖
build.gradle
applyplugin:'java'
repositories{
mavenCentral()
}
dependencies{
compilegroup:'org.hibernate',name:'hibernate-core',version:'3.6.7.Final'
testCompilegroup:'junit',name:'junit',version:'4.+'
}
这里发生了什么?这个构建脚本声明Hibernatecore3.6.7.Final被用来编译项目的源代码.Byimplication,在运行阶段同样也
需要Hibernatecore和它的依赖.构建脚本同样声明了需要junit>=4.0的版本来编译项目测试.它告诉Gradle到Maven库
里找任何需要的依赖.接下来的部分会具体说明.
声明你的依赖
在Gradle里,依赖可以组合成配置.一个配置简单地说就是一系列的依赖.我们称它们为依赖配置.你可以使用它们声明项目
的外部依赖.正如我们将在后面看到,它们也被用来声明项目的发布.
Java插件定义了许多标准的配置.下面列出了一些,你也可以在表格23.5,“Java插件-依赖配置”里发现更多具体的信息.
compile
用来编译项目源代码的依赖.
runtime
在运行时被生成的类使用的依赖.默认的,也包含了编译时的依赖.
testCompile
编译测试代码的依赖.默认的,包含生成的类运行所需的依赖和编译源代码的依赖.
testRuntime
运行测试所需要的依赖.默认的,包含上面三个依赖.
各种各样的插件加入许多标准的配置.你也可以定义你自己的配置.参考50.3,“配置依赖”可以找到更加具体的定义和定制一
个自己的依赖配置.
依赖配置
你可以声明许多种依赖.其中一种是外部依赖.这是一种在当前构建之外的一种依赖,它被存放在远程或本地的仓库里,比如
Maven的库,或者Ivy库,甚至是一个本地的目录.
下面的例子讲展示如何加入外部依赖
例子7.2.定义一个外部依赖
build.gradle
dependencies{
compilegroup:'org.hibernate',name:'hibernate-core',version:'3.6.7.Final'
}
引用一个外部依赖需要使用group,name和version属性.根据你想要使用的库,group和version可能会有所差别.
有一种简写形式,只使用一串字符串"group:name:version".
例子7.3.外部依赖的简写形式
build.gradle
dependencies{
compile'org.hibernate:hibernate-core:3.6.7.Final'
}
外部的依赖
Gradle是怎样找到那些外部依赖的文件的呢?Gradle会在一个仓库里找这些文件.仓库其实就是文件的集合,通过group,
name和version整理分类.Gradle能解析好几种不同的仓库形式,比如Maven和Ivy,同时可以理解各种进入仓库的方法,比
如使用本地文件系统或者HTTP.
默认地,Gradle不提前定义任何仓库.在使用外部依赖之前,你需要自己至少定义一个库.比如使用下面例子中的Maven
central仓库:
例子7.4.Mavencentral仓库
build.gradle
repositories{
mavenCentral()
}
或者使用一个远程的Maven仓库:
例子7.5.使用远程的Maven仓库
build.gradle
repositories{
maven{
url"http://repo.mycompany.com/maven2"
}
}
或者一个远程的Ivy仓库:
例子7.6.使用远程的Ivy仓库
build.gradle
repositories{
ivy{
url"http://repo.mycompany.com/repo"
}
}
你也可以使用本地的文件系统里的库.Mqven和Ivy都支持下载的本地.
例子7.7.使用本地的Ivy目录
build.gradle
repositories{
ivy{
//URLcanrefertoalocaldirectory
url"../local-repo"
}
}
一个项目可以有好几个库.Gradle会根据依赖定义的顺序在各个库里寻找它们,在第一个库里找到了就不会再在第二个库里找
它了.
仓库
可以在第50.6章,“仓库”里找到更详细的信息.
依赖配置也可以用来发布文件.我们称这些文件publicationartifacts,或者就叫artifacts.
插件可以很好的定义一个项目的artifacts,所以你并不需要做一些特别的工作来让Gradle需要发布什么.你可以通过在
uploadArchives任务里加入仓库来完成.下面是一个发布远程Ivy库的例子:
例子7.8.发布一个Ivy库
build.gradle
uploadArchives{
repositories{
ivy{
credentials{
username"username"
password"pw"
}
url"http://repo.mycompany.com"
}
}
}
现在,当你运gradleuploadArchives,Gradle将构建和上传你的Jar.Gradle也会生成和上传ivy.xml.
你也可以发布到Maven库.请注意你需要加入Maven插件来发布一个Maven库.在下面的例子里,Gradle将生成和上传
pom.xml.
例子7.9.发布Maven库
build.gradle
applyplugin:'maven'
uploadArchives{
repositories{
mavenDeployer{
repository(url:"file://localhost/tmp/myRepo/")
}
}
}
在第51章,发布artifacts里有更加具体的介绍.
发布artifacts
创建Groovy项目时,你需要使用Groovy插件.这个插件扩展了Java插件,加入了编译Groovy的依赖.你的项目可以包含
Groovy的源代码,Java源代码,或者它们的混合.
Groovy快速入门
让我们看一个例子.为了使用Groovy插件,加入下面的代码:
例子8.1.Groovy插件
build.gradle
applyplugin:'groovy'
它也会同时把Java插件加入到你的项目里.Groovy插件扩展了编译任务,这个任务会在src/main/groovy目录里寻找源代码
文件,并且加入了编译测试任务来寻找src/test/groovy目录里的测试源代码.编译任务使用联合编译(jointcompilation)来编
译这些目录,这里的联合指的是它们混合有java和groovy的源文件.
使用groovy编译任务,你必须声明Groovy的版本和Groovy库的位置.你可以在配置文件里加入依赖,编译配置会继承这个
依赖,然后groovy库将被包含在classpath里.
例子8.2.Groovy2.2.0
build.gradle
repositories{
mavenCentral()
}
dependencies{
compile'org.codehaus.groovy:groovy-all:2.3.3'
}
下面是完整的构建文件:
例子8.3.完整的构建文件
build.gradle
applyplugin:'eclipse'
applyplugin:'groovy'
repositories{
mavenCentral()
}
dependencies{
compile'org.codehaus.groovy:groovy-all:2.3.3'
testCompile'junit:junit:4.11'
}
运行gradlebuild命令将会开始编译,测试和创建JAR文件.
一个基本的Groovy项目
这一章描述了一个非常简单的Groovy项目.通常,一个真正的项目要比这个复杂的多.因为Groovy项目是一个Java项目,任
何你可以对Java项目做的配置也可以对Groovy项目做.
第24章,Groovy插件有更加详细的描述,你也可以在samples/groovy目录里找到更多的例子.
总结
这一章官网正在补充.还没有完成.
Gradle提供了两个插件用来支持网页应用:War插件和Jetty插件.War插件是在Java插件的基础上扩充的用来构建WAR
文件.Jetty插件是在War插件的基础上扩充的,允许用户将网页应用发布到一个介入的Jetty容器里.
网页应用快速入门
为了构建一个WAR文件,需要在项目中加入War插件:
例子9.1.War插件
build.gradle
applyplugin:'war'
这个插件也会在你的项目里加入Java插件.运行gradlebuild将会编译,测试和创建项目的WAR文件.Gradle将会把源文
件包含在WAR文件的src/main/webapp目录里.编译后的classe,和它们运行所需要的依赖也会被包含在WAR文件里.
构建一个WAR文件
要启动Web工程,在项目中加入Jettyplugin即可:
例9.2.采用Jettyplugin启动web工程
build.gradle
applyplugin:'jetty'
由于Jettyplugin继承自Warplugin.使用gradlejettyRun命令将会把你的工程启动部署到jetty容器中.调用gradle
jettyRunWar命令会打包并启动部署到jetty容器中.
TODO:whichurl,configureport,usessourcefilesinplaceandcanedityourfilesandreload.
Runningyourwebapplication
了解更多关于Warplugin和Jettyplugin的应用请参阅第26章,WarPlugin以及第28章,JettyPlugin.
你可以在发行包的samples/webApplication下找到更多示例.
总结
本章介绍了命令行的一些基本功能.正如在前面的章节里你所见到的调用gradle命令来运行一个构建.
使用Gradle命令行
你可以以列表的形式在命令行中一次调用多个任务.例如gradlecompiletest命令会依次调用compile和test任务,它们所
依赖的任务也会被调用.这些任务只会被调用一次,无论它们是否被包含在脚本中:即无论是以命令行的形式定义的任务还是依
赖于其它任务都会被调用执行.来看下面的例子.
下面定义了四个任务dist和test都依赖于compile,只用当compile被调用之后才会调用gradledisttest任务
示例图10.1.任务依赖
例子10.1.多任务调用
build.gradle
taskcompile<<{
println'compilingsource'
}
taskcompileTest(dependsOn:compile)<<{
println'compilingunittests'
}
tasktest(dependsOn:[compile,compileTest])<<{
println'runningunittests'
}
taskdist(dependsOn:[compile,test])<<{
println'buildingthedistribution'
}
gradledisttest命令的输出
>gradledisttest
:compile
compilingsource
:compileTest
compilingunittests
:test
runningunittests
:dist
buildingthedistribution
BUILDSUCCESSFUL
Totaltime:1secs
由于每个任务仅会被调用一次,所以调用gradletesttest与调用gradletest效果是相同的.
多任务调用
你可以用命令行选项-x来排除某些任务,让我们用上面的例子来示范一下.
例子10.2.排除任务
gradledist-xtest命令的输出
>gradledist-xtest
:compile
compilingsource
:dist
buildingthedistribution
BUILDSUCCESSFUL
Totaltime:1secs
可以看到,test任务并没有被调用,即使它是dist任务的依赖.同时test任务的依赖任务compileTest也没有被调用,而像
compile被test和其它任务同时依赖的任务仍然会被调用.
排除任务
默认情况下,只要有任务调用失败,Gradle就会中断执行.这可能会使调用过程更快,但那些后面隐藏的错误就没有办法发现了.
所以你可以使用--continue选项在一次调用中尽可能多的发现所有问题.
采用了--continue选项,Gralde会调用每一个任务以及它们依赖的任务.而不是一旦出现错误就会中断执行.所有错误信息都会
在最后被列出来.
一旦某个任务执行失败,那么所有依赖于该任务的子任务都不会被调用.例如由于test任务依赖于complie任务,所以如果
compile调用出错,test便不会被直接或间接调用.
失败后继续执行构建
当你试图调用某个任务的时候,你并不需要输入任务的全名.只需提供足够的可以唯一区分出该任务的字符即可.例如,上面的
例子你也可以这么写.用gradledi来直接调用dist任务:
例10.3.简化任务名
gradledi命令的输出
>gradledi
:compile
compilingsource
:compileTest
compilingunittests
:test
runningunittests
:dist
buildingthedistribution
BUILDSUCCESSFUL
Totaltime:1secs
你也可以用在驼峰命名方式(通俗的说就是每个单词的第一个字母大写,除了第一个单词)的任务中每个单词的首字母进行调
用.例如,可以执行gradlecompTest或者gradlecT来调用compileTest任务
例11.4.简化驼峰方式的任务名
gradlecT命令的输出
>gradlecT
:compile
compilingsource
:compileTest
compilingunittests
BUILDSUCCESSFUL
Totaltime:1secs
简化后你仍然可以使用-x参数.
简化任务名
调用gradle命令时,默认情况下总是会构建当前目录下的文件,可以使用-b参数选择其他目录的构建文件,并且当你使用此参
数时settings.gradle将不会生效,看下面的例子:
例10.5.选择文件构建
subdir/myproject.gradle
taskhello<<{
println"usingbuildfile'$buildFile.name'in'$buildFile.parentFile.name'."
}
gradle-q-bsubdir/myproject.gradlehello的输出
gradle-q-bsubdir/myproject.gradlehello
usingbuildfile'myproject.gradle'in'subdir'.
另外,你可以使用-p参数来指定构建的目录,例如在多项目构建中你可以用-p来替代-b参数
例10.6.选择构建目录
gradle-q-psubdirhello命令的输出
gradle-q-psubdirhello
usingbuildfile'build.gradle'in'subdir'.
-b参数用以指定脚本具体所在位置,格式为dirpwd/build.gradle.
-p参数用以指定脚本目录即可.
选择文件构建
执行gradleprojects命令会为你列出子项目名称列表.
例10.7.收集项目信息
gradle-qprojects命令的输出结果
>gradle-qprojects
------------------------------------------------------------
Rootproject
------------------------------------------------------------
Rootproject'projectReports'
+---Project':api'-ThesharedAPIfortheapplication
\---Project':webapp'-TheWebapplicationimplementation
Toseealistofthetasksofaproject,rungradle<project-path>:tasks
Forexample,tryrunninggradle:api:tasks
这份报告展示了每个项目的描述信息.当然你可以在项目中用description属性来指定这些描述信息.
例10.8.为项目添加描述信息.
build.gradle
description='ThesharedAPIfortheapplication'
项目列表
执行gradletasks命令会列出项目中所有任务.这会显示项目中所有的默认任务以及每个任务的描述.
例10.9获取任务信息
gradle-qtasks命令的输出
>gradle-qtasks
------------------------------------------------------------
Alltasksrunnablefromrootproject
------------------------------------------------------------
Defaulttasks:dists
Buildtasks
-----------
clean-Deletesthebuilddirectory(build)
dists-Buildsthedistribution
libs-BuildstheJAR
BuildSetuptasks
-----------------
init-InitializesanewGradlebuild.[incubating]
wrapper-GeneratesGradlewrapperfiles.[incubating]
Helptasks
----------
dependencies-Displaysalldependenciesdeclaredinrootproject'projectReports'.
dependencyInsight-Displaystheinsightintoaspecificdependencyinrootproject'projectReports'.
help-Displaysahelpmessage
projects-Displaysthesub-projectsofrootproject'projectReports'.
properties-Displaysthepropertiesofrootproject'projectReports'.
tasks-Displaysthetasksrunnablefromrootproject'projectReports'(someofthedisplayedtasksmaybelongtosubprojects).
Toseealltasksandmoredetail,runwith--all.
默认情况下,这只会显示那些被分组的任务.你可以通过为任务设置group属性和description来把这些信息展示到结果中.
例10.10.更改任务报告内容
build.gradle
dists{
description='Buildsthedistribution'
group='build'
}
当然你也可以用--all参数来收集更多任务信息.这会列出项目中所有任务以及任务之间的依赖关系.
例10.11获得更多的任务信息
gradle-qtasks--all命令的输出
>gradle-qtasks--all
------------------------------------------------------------
Alltasksrunnablefromrootproject
------------------------------------------------------------
Defaulttasks:dists
Buildtasks
-----------
clean-Deletesthebuilddirectory(build)
任务列表
api:clean-Deletesthebuilddirectory(build)
webapp:clean-Deletesthebuilddirectory(build)
dists-Buildsthedistribution[api:libs,webapp:libs]
docs-Buildsthedocumentation
api:libs-BuildstheJAR
api:compile-Compilesthesourcefiles
webapp:libs-BuildstheJAR[api:libs]
webapp:compile-Compilesthesourcefiles
BuildSetuptasks
-----------------
init-InitializesanewGradlebuild.[incubating]
wrapper-GeneratesGradlewrapperfiles.[incubating]
Helptasks
----------
dependencies-Displaysalldependenciesdeclaredinrootproject'projectReports'.
api:dependencies-Displaysalldependenciesdeclaredinproject':api'.
webapp:dependencies-Displaysalldependenciesdeclaredinproject':webapp'.
dependencyInsight-Displaystheinsightintoaspecificdependencyinrootproject'projectReports'.
api:dependencyInsight-Displaystheinsightintoaspecificdependencyinproject':api'.
webapp:dependencyInsight-Displaystheinsightintoaspecificdependencyinproject':webapp'.
help-Displaysahelpmessage
api:help-Displaysahelpmessage
webapp:help-Displaysahelpmessage
projects-Displaysthesub-projectsofrootproject'projectReports'.
api:projects-Displaysthesub-projectsofproject':api'.
webapp:projects-Displaysthesub-projectsofproject':webapp'.
properties-Displaysthepropertiesofrootproject'projectReports'.
api:properties-Displaysthepropertiesofproject':api'.
webapp:properties-Displaysthepropertiesofproject':webapp'.
tasks-Displaysthetasksrunnablefromrootproject'projectReports'(someofthedisplayedtasksmaybelongtosubprojects).
api:tasks-Displaysthetasksrunnablefromproject':api'.
webapp:tasks-Displaysthetasksrunnablefromproject':webapp'.
执行gradlehelp--tasksomeTask可以显示指定任务的详细信息.或者多项目构建中相同任务名称的所有任务的信息.如下
例.
例10.12.获取任务帮助
gradle-qhelp--tasklibs的输出结果
>gradle-qhelp--tasklibs
Detailedtaskinformationforlibs
Paths
:api:libs
:webapp:libs
Type
Task(org.gradle.api.Task)
Description
BuildstheJAR
这些结果包含了任务的路径、类型以及描述信息等.
获取任务具体信息
执行gradledependencies命令会列出项目的依赖列表,所有依赖会根据任务区分,以树型结构展示出来.如下例:
例10.13.获取依赖信息
gradle-qdependenciesapi:dependencieswebapp:dependencies的输出结果
>gradle-qdependenciesapi:dependencieswebapp:dependencies
------------------------------------------------------------
Rootproject
------------------------------------------------------------
Noconfigurations
------------------------------------------------------------
Project:api-ThesharedAPIfortheapplication
------------------------------------------------------------
compile
\---org.codehaus.groovy:groovy-all:2.3.3
testCompile
\---junit:junit:4.11
\---org.hamcrest:hamcrest-core:1.3
------------------------------------------------------------
Project:webapp-TheWebapplicationimplementation
------------------------------------------------------------
compile
+---project:api
|\---org.codehaus.groovy:groovy-all:2.3.3
\---commons-io:commons-io:1.2
testCompile
Nodependencies
虽然输出结果很多,但这对于了解构建任务十分有用,当然你可以通过--configuration参数来查看指定构建任务的依赖情况:
例10.14.过滤依赖信息
gradle-qapi:dependencies--configurationtestCompile的输出结果
>gradle-qapi:dependencies--configurationtestCompile
------------------------------------------------------------
Project:api-ThesharedAPIfortheapplication
------------------------------------------------------------
testCompile
\---junit:junit:4.11
\---org.hamcrest:hamcrest-core:1.3
获取依赖列表
执行RunninggradledependencyInsight命令可以查看指定的依赖.如下面的例子.
例10.15.获取特定依赖
gradle-qwebapp:dependencyInsight--dependencygroovy--configurationcompile的输出结果
>gradle-qwebapp:dependencyInsight--dependencygroovy--configurationcompile
org.codehaus.groovy:groovy-all:2.3.3
\---project:api
\---compile
这个task对于了解依赖关系、了解为何选择此版本作为依赖十分有用.了解更多请参阅DependencyInsightReportTask.
dependencyInsight任务是'Help'任务组中的一个.这项任务需要进行配置才可以使用.Report查找那些在指定的配置里特定的
依赖.
如果用了Java相关的插件,那么dependencyInsight任务已经预先被配置到'compile'下了.你只需要通过'--dependency'参数
来制定所需查看的依赖即可.如果你不想用默认配置的参数项你可以通过'--configuration'参数来进行指定.了解更多请参阅
DependencyInsightReportTask.
查看特定依赖
执行gradleproperties可以获取项目所有属性列表.如下例:
例10.16.属性信息
gradle-qapi:properties的输出结果
>gradle-qapi:properties
------------------------------------------------------------
Project:api-ThesharedAPIfortheapplication
------------------------------------------------------------
allprojects:[project':api']
ant:org.gradle.api.internal.project.DefaultAntBuilder@12345
antBuilderFactory:org.gradle.api.internal.project.DefaultAntBuilderFactory@12345
artifacts:org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler@12345
asDynamicObject:org.gradle.api.internal.ExtensibleDynamicObject@12345
baseClassLoaderScope:org.gradle.api.internal.initialization.DefaultClassLoaderScope@12345
buildDir:/home/user/gradle/samples/userguide/tutorial/projectReports/api/build
buildFile:/home/user/gradle/samples/userguide/tutorial/projectReports/api/build.gradle
获取项目属性列表
UsingtheGradleGraphicalUserInterface
WritingBuildScripts
Tutorial-'ThisandThat'
MoreaboutTasks
WorkingWithFiles
YoucanlocateafilerelativetotheprojectdirectoryusingtheProject.file()method.
Example16.1.Locatingfiles
build.gradle
//Usingarelativepath
FileconfigFile=file('src/config.xml')
//Usinganabsolutepath
configFile=file(configFile.absolutePath)
//UsingaFileobjectwitharelativepath
configFile=file(newFile('src/config.xml'))`
Youcanpassanyobjecttothefile()method,anditwillattempttoconvertthevaluetoanabsoluteFileobject.Usually,you
wouldpassitaStringorFileinstance.Ifthispathisanabsolutepath,itisusedtoconstructaFileinstance.Otherwise,a
Fileinstanceisconstructedbyprependingtheprojectdirectorypathtothesuppliedpath.Thefile()methodalso
understandsURLs,suchasfile:/some/path.xml.
UsingthismethodisausefulwaytoconvertsomeuserprovidedvalueintoanabsoluteFile.Itispreferabletousingnew
File(somePath),asfile()alwaysevaluatesthesuppliedpathrelativetotheprojectdirectory,whichisfixed,ratherthanthe
currentworkingdirectory,whichcanchangedependingonhowtheuserrunsGradle.
Locatingfiles
Filecollections