在 eclipse 下利用 gradle 构建系统
基本开发环境
- 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对应版本的其他工具,包括开发工具、Java EE 服务器、Apache Ant、SoapUI。
- 开发工具:Eclipse IDE for SOA Developers 版本,请到 http://www.eclipse.org/downloads/ 网站下载,当然任何版本的 eclipse 都是可以的。
- Java EE 服务器:Apache-Tomcat-6.0.18,可以到 http://tomcat.apache.org/download-60.cgi 下载,使用 5.0 以上的任何版本都可以的,当然,您也可以使用 Jboss 等其他 Java EE 服务器。
- Jdk:到 http://java.sun.com 下载 1.5.0_17 版本,下载后安装即可。
Ant,Maven,Gradle 简单比较
Ant 是我们过去构建系统基本都会用到的,xml 脚本文件中包括若干 task 任务,任务之间可以互相依赖,对于一个大的项目来说,这些 xml 文件维护起来的确不是一件容易的事情,还有那些项目依赖的而没有版本号的 jar 包,有时真的让人头疼,后来 Maven 出现了,基于中央仓库的编译相对于 Ant 来说的确是好了很多,但是,是不是 Ant,Maven 就是我们构建项目的唯一选择呢?呵呵,当然不了,利用 Gradle 来构建系统我认为将成为 java 构建项目的最佳选择,简单,快速,对初学者无苛刻要求,可以说是拿来就会用,而且我们再也不用看那些冗长而复杂的 xml 文件了,因为 Gradle 是基于 Groovy 语言的,Groovy 大家应该很熟悉吧,是基于 Java Virtual Machine 的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性,如果你是一个 Ant 的完全支持者,也没有问题,因为 Gradle 可以很平滑的来调用 Ant 文件的,我这样说你可能不接受 Gradle,下面我们就会通过一个个具体实例来讲解 Ant,Maven,Gradle 构建项目的过程,通过例子我们能很容易明白它们的差异。Let ’ s go。
用 Ant 来构建简单系统
新建一个 Java project, 命名为 ant_project
图 1. 新建 ant_project 项目
然后新建一个 HelloWorld 类,我们下面就是将这个项目通过 Ant 来编译,打包,类的代码列表如清单 1 所示:
清单 1. HelloWorld 类
package org.ant.test; public class HelloWorld { public String sayHello(String name){ return "Hello "+name; } }
然后再新建一个 build 文件,命名为 build.xml, 内容如清单 3 所示:
清单 2. build.xml
Gradle 在多个工程中的应用
做项目时候,经常会碰到多个工程的情况,最通常的情况我们也分为服务器端和客户端两部分,这种情况我们过去用 Ant 时候会在每个工程下面都建立个 build.xml 文件或者建立一个 build.xml 文件,然后在这个 build.xml 文件中建立不同工程的 target,将将被引用的工程打成 jar 包来供其他工程引用,那么 Gradle 是怎样来完成这样的需求的呢?下面我们举个具体的例子来详细演示下。首先我们新建一个主工程命名为 gradle_multiProject, 然后在主工程下在新建一个子工程命名为 sub_projectOne, 在两个工程下面都有一个各自独立的 src 并且符合 Gradle 要求的目录结构,在每个工程下面都建个类命名为 HelloWorld,类内容同清单 1. 然后我们新建个 settings.gradle 文件,内容见清单 18。
清单 18. settings.gradle 文件内容
include "sub_projectone"
然后在新建一个我们熟悉的 build.gradle 文件,文件内容见清单 19。
清单 19. 主工程目录下 build.gradle 文件内容
Closure printProjectName = { task -> println "I'm $task.project.name" } task hello << printProjectName project(':sub_projectone') { task hello << printProjectName }
然后我们使用命令 gradle – q hello 运行一下,运行结果如清单 20 所示。
清单 20. 命令运行结果
E:ws_IBMgradle_multiProject>gradle -q hello I'm gradle_multiProject I'm sub_projectone
我们会发现,这个命令将主工程和子工程的名字都打印出来了,为什么会这样呢?我想你一定猜对了,因为我们在 build.gradle 文件中使用了 project() 方法,方法内传入的是子工程的名称,如果我们子工程不止一个,那么我们又该怎样来调用呢?这时候我们只需要调用另一个方法 allprojects 即可,注意 allprojects 方法是不需要传入参数的,它返回的是当前工程和当前工程下面的所有子工程的列表。上面演示的内容其实我们不经常用到的,这里简单的介绍下就是为了说明 gradle 给我们提供了好多方法来供我们调用,在多工程的环境下我们可以灵活的使用它们来达到我们的要求,下面我们就步入正题来看看在多工程情况下,gradle 是如何来编译,打包各自工程的。这里我们添加些内容到 build.gradle 文件,内容见清单 21。
清单 21. 添加到 build.gradle 文件中的内容
subprojects{ apply plugin: 'java' }
然后我们用命令 gradle build,发现主工程下面的所有子工程都新增了一个 build 文件夹,这个文件夹下包含编译生成的 class 文件和 jar 文件,而主工程的 src 下的代码却没有被编译,打包。那么我们怎样做能让主工程和子工程同时被编译,打包呢?方法很简单,我们只需要在 build.gradle 文件中增加 apply plugin: 'java' 这么一行代码,现在完整的 build.gradle 内容见清单 22。
清单 22. 完整的 build.gradle 文件内容
apply plugin: 'java' subprojects{ apply plugin: 'java' }
是不是很难想象,就这么几行代码就完成了将所有工程中的代码都编译了并且都打成了 jar 文件。有的朋友会问了,如果子工程与主工程他们打成的包不一样,有的是需要 jar 包,有的需要打成 war 包等等,这样的需求我们该怎样做呢,很简单我们只需要在需要打成 war 包的工程下面新建立个 build.gradle 文件,该文件内容为 apply plugin: 'war',然后我们我们在主工程目录下使用 gradle build 命令即可生成我们需要的 war 包了,Gradle 就是使用这种方法来满足那种差异性的需求的。
使用 Ant 的朋友们一定会深有感触的吧!也许有些朋友会有反面的一些声音,尤其对那些 Ant 的热爱者们,一定会说,Ant 如果你使用的好,封装的好一样可以很简洁并且也能达到这个效果的,的确是这样的,Gradle 只不过是把我们经常要使用的一些功能项给封装成了方法,然后我们调用这些方法即可了,再说了,Gradle 调用 Ant 脚本也是可以的,如果你一定要用 Ant, 那么你用 Gradle 来组织一下逻辑也是不错的选择。下面我们简单看下在 Gradle 中式怎样来调用 Ant 脚本的。
Gradle 中调用 Ant 脚本
首先我们建立 Ant 文件 build.xml, 文件详细内容见清单 23.
清单 23. build.xml 文件内容
Hello, from Ant
然后我们在建立个 build.gradle 文件,文件详细内容见清单 24。
清单 24. build.gradle 文件内容
ant.importBuild 'build.xml'
简单吧,一句话的事情而已,呵呵。然后我们使用 gradle hello 命令来看下结果,结果见清单 25。
清单 25. Gradle 调用 Ant 文件的运行结果
E:gdccmegradle-0.9-preview-1samplesuserguideanthello>gradle hello :hello [ant:echo] Hello, from Ant BUILD SUCCESSFUL Total time: 9.734 secs
可以看出,的确调用的是 Ant 的 build.xml 文件吧。
总结
本教程通具体实例来讲解如何使用 Gradle 来构建工程的,并在具体实例中引入我们熟悉的 Ant 来对比完成,这样能使 Ant 的爱好者们能更快的上手,并能一目了然的看到两者的优缺点,最后并讲解了怎样和 Ant 来集成,每一个实例都是通过从新建工程开始一步一步的带领大家来继续的,我们知道仅仅通过一片文章来很详细的将 Gradle 的方方面面都阐述的很清楚,那是不可能的,本教程提供了最基本,最基础的开发过程,任何复杂的事务归根结底还是源于基础,我一向倡导,“授之以鱼,不如授之以渔”,我想只要方向对了,知道如何下手了,就不会有大的失误。最后祝大家工作顺利。
http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/