现代高效的java构建工具gradle的快速入门
和maven一样,gradle只是提供了构建项目的一个框架,真正起作用的是plugin。gradle在默认情况下为我们提供了许多常用的plugin,其中包括有构建java项目的plugin,还有war,ear等。与maven不同的是,gradle不提供内建的项目生命周期管理,只是java plugin向project中添加了许多task,这些task依次执行,为我们营造了一种如同maven般项目构建周期。更多有关maven的知识,读者可以访问maven官网,或者可以参考笔者写的maven学习系列文章。
现在我们都在谈领域驱动设计,gradle本身的领域对象主要有project和task。project为task提供了执行上下文,所有的plugin要么向project中添加用于配置的property,要么向project中添加不同的task。一个task表示一个逻辑上较为独立的执行过程,比如编译java源代码,拷贝文件,打包jar文件,甚至可以是执行一个系统命令或者调用ant。另外,一个task可以读取和设置project的property以完成特定的操作。
让我们来看一个最简单的task,创建一个build.gradle文件,内容如下:
task helloworld << { println "hello world!" }
这里的“<<”表示向helloworld中加入执行代码——其实就是groovy代码。gradle向我们提供了一整套dsl,所以在很多时候我们写的代码似乎已经脱离了groovy,但是在底层依然是执行的groovy。比如上面的task关键字,其实就是一个groovy中的方法,而大括号之间的内容则表示传递给task()方法的一个闭包。除了“<<”之外,我们还很多种方式可以定义一个task,我们将在本系列后续的文章中讲到。
在与build.gradle相同的目录下执行:
gradle helloworld
命令行输出如下:
:helloworld hello world! build successful total time: 2.544 secs
在默认情况下,gradle将当前目录下的build.gradle文件作为项目的构建文件。在上面的例子中,我们创建了一个名为helloworld的task,在执行gradle命令时,我们指定执行这个helloworld task。这里的helloworld是一个defaulttask类型的对象,这也是定义一个task时的默认类型,当然我们也可以显式地声明task的类型,甚至可以自定义一个task类型(我们将在本系列的后续文章中讲到)。
比如,我们可以定义一个用于文件拷贝的task:
task copyfile(type: copy) { from 'xml' into 'destination' }
以上copyfile将xml文件夹中的所有内容拷贝到destination文件夹中。这里的两个文件夹都是相对于当前project而言的,即build.gradle文件所在的目录。
task之间可以存在依赖关系,比如taska依赖于taskb,那么在执行taska时,gradle会先执行taskb,然后再执行taska。声明task依赖关系的一种方式是在定义一个task的时候:
task taska(dependson: taskb) { //do something }
gradle在默认情况下为我们提供了几个常用的task,比如查看project的properties、显示当前project中定义的所有task等。可以通过一下命令查看project中所有的task:
gradle tasks
输出如下:
:tasks
------------------------------------------------------------
all tasks runnable from root project
------------------------------------------------------------build setup tasks
-----------------
setupbuild - initializes a new gradle build. [incubating]
wrapper - generates gradle wrapper files. [incubating]help tasks
----------
dependencies - displays all dependencies declared in root project 'gradle-blog'.
dependencyinsight - displays the insight into a specific dependency in root project 'gradle-blog'.
help - displays a help message
projects - displays the sub-projects of root project 'gradle-blog'.
properties - displays the properties of root project 'gradle-blog'.
tasks - displays the tasks runnable from root project 'gradle-blog'.other tasks
-----------
copyfile
helloworldto see all tasks and more detail, run with --all.
build successful
total time: 2.845 secs
可以看到,除了我们自己定义的copyfile和helloworld之外,gradle还默认为我们提供了dependencies、projects和properties等task。dependencies用于显示project的依赖信息,projects用于显示所有project,包括根project和子project,而properties则用于显示一个project所包含的所有property。
在默认情况下,gradle已经为project添加了很多property,我们可以调用以下命令进行查看:
gradle properties
输出如下:
:properties
------------------------------------------------------------
root project
------------------------------------------------------------allprojects: [root project 'gradle-blog']
ant: org.gradle.api.internal.project.defaultantbuilder@1342097builddir: /home/davenkin/desktop/gradle-blog/build
buildfile: /home/davenkin/desktop/gradle-blog/build.gradle
...
configurations: []
convention: org.gradle.api.internal.plugins.defaultconvention@11492ed
copyfile: task ':copyfile'
...
ext: org.gradle.api.internal.plugins.defaultextrapropertiesextension@1b5d53a
extensions: org.gradle.api.internal.plugins.defaultconvention@11492ed
...
helloworld: task ':helloworld'
...
plugins: [org.gradle.api.plugins.helptasksplugin@7359f7]
project: root project 'gradle-blog'
...
properties: {...}
repositories: []tasks: [task ':copyfile', task ':helloworld']
version: unspecifiedbuild successful
total time: 2.667 secs
在以上property中,allprojects表示所有的project,这里只包含一个根project,在多项目构建中,它将包含多个project;builddir表示构建结果的输出目录;我们自己定义的helloworld和copyfile也成为了project中的property。另外,project还包括用于执行ant命令的defaultantbuilder(property名为ant)和project的描述属性description。
在下一篇文章中,我们将讲到创建task的多种方法。
请通过以下方式下载本系列文章的github示例代码:
git clone https://github.com/davenkin/gradle-learning.git
到此这篇关于现代高效的java构建工具gradle的快速入门的文章就介绍到这了,更多相关gradle 入门内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!