Gradle

是对于ant和maven的改进,在核心概念上并没有新的引入 。project是一个项目的最大概念抽象,task是最小执行单元,仅此而已。具备了很多maven的优良特性:依赖管理、仓库、约定优于配置等等,也很好的支持ant的编译语法(对于原本使用ant的人来说转变非常的容易)。目前支持Java、Groovy和Scala。官网是 :http://www.gradle.org/

gradle的安装
下载相应的jar包,设置GRADLE_HOME,并将GRADLE_HOME/bin添加到PATH路径下即可。若是偷懒的话直接 sudo aptitude install gradle 安装即可(通过这个安装的话会去下载依赖的open-jdk,有点慢,居然还去下了eclipse-pde,更扯蛋!),优点是省事。

命令行下运行gradle -v 查看是否设置成功!

zhaoming@zhaoming:~$ gradle -v</pre>
------------------------------------------------------------
 Gradle 1.0-milestone-3
 ------------------------------------------------------------

Gradle build time: Thursday, September 8, 2011 4:06:52 PM UTC
 Groovy: 1.8.6
 Ant: Apache Ant(TM) version 1.8.2 compiled on December 3 2011
 Ivy: non official version
 JVM: 1.6.0_27 (Sun Microsystems Inc. 20.0-b12)
 OS: Linux 3.2.0-45-generic amd64

几个重要的文件
build.gradle。类似于maven的pom.xml,以下所有的配置都是在这个文件中。
setting.gradle:类似于maven中setting.xml,不过setting.gradle可以放在项目中,优先加载项目中的setting.gradle。

优点一:简洁的依赖管理
依赖管理这点上,使用了groovy的简洁语法特性(特定声明语言)简化了一些包依赖的配置。
简单案例
maven的包依赖:

<dependencies>
  <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
  </dependency>
  <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-beans</artifactId>
  </dependency>
  <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
  </dependency>
</dependencies>

gradle的包依赖:

 dependencies {
   compile('org.springframework:spring-core:2.5.6','org.springframework:spring-mvc:2.5.6') //多个的话直接在里面添加即可!
   runtime('org.springframework:spring-beans:2.5.6')
   testCompile('org.springframework:spring-context:2.5.6')
 }

包依赖存在三种范围:compile, runtime 和 testCompile.在上面的例子中也已经看到,compile包含了runtime和testCompile.

特性二:包传递的良好控制
进入maven时代后,最大的问题就是依赖包之间的传递,maven是通过exelude来解决。而gradle可以更好的解决这个问题,主要是transitive(关闭传递依赖)和exclude(阻止传递依赖)。
看看实际例子:

  dependencies {
     compile('org.springframework:spring-core:2.5.6'{
     transitive = false //关闭传递依赖,相对于maven的优势
     exclude group:'org.springframework',name:'spring-core',version:'2.5.6' 阻止传递依赖
  })
 }

特性三:简单的仓库配置及包上传

 repositories {
   mavenLocal()
   mavenCentral()
   mavenRepo urls: "http://repository.jboss.com/maven2"
 }

下载的包会放在 $HOME/.gradle/cache/ 目录下,基本跟maven一样。

通过Maven Plugin可以服用maven仓库。

apply plugin: 'maven'
 apply plugin: 'java' //加载java插件
 apply plugin: 'war'

uploadArchives {
repositories.mavenDeployer {
repository(url: "http://localhost:8088/nexus/content/repositories/snapshots/") {
authentication(userName: "admin", password: "admin")
pom.groupId = "com.inter12"
pom.artifactId = "swiftly"
}
 }
 }

特性四:约定大于配置
传统的开发包是下面的结构,目前主流的IDE默认也是这种模式。

src/main/java
 src/main/resources
 src/test/java
 src/test/resources

若是你想改变这种模式的话可如下定义:

sourceSets {
 main {
 java {
 srcDir 'src/java'
 }
 resources {
 srcDir 'src/resources'
 }
 }
 }

这个特性有点鸡肋,因为一般不会去动包结构目录。若是将来支持ruby等语言的话会有点用处。

总结:
一 gradle是基于groovy来写的,相对于maven,它的位置也有点像groovy之于java,groovy简化了java繁琐的静态语法检查,gradle去除了繁重的xml描述。带来的好处是灵活。缺陷也非常的明显,过于灵活就容易出错。对于maven的最大优势是简化了描述语法,但是仅此优点很难吸引广大用户从maven迁移到gradle,一方面是groovy的学习成本,另一方面是xml是业界标准化的结构语言,而groovy只是在java领域内的DSL,所以很难推广到其他的语言上,从目前只支持Java、Groovy和Scala等基于JVM的语言上也可以看出。标准化才是出路啊,将来可预见的发展也仅仅如ruby中的rake。

二 看gradle的一些语法结构可以很明显看出ant的痕迹,可以说gradle就是基于ant,并吸收了maven优点新构建工具。单乱复杂度的话maven太过复杂了。

三 业界的一些工具和开源软件还是非常支持gradle的,例如eclipse和intellj IDE,还有SpringSource、 Hibernate 、 Grails也都支持gradle,我想更多的还是因为这些工具或是开源软件的开发人员自身的能力决定了他们愿意去采用或是尝试gradle。

作者: inter12

在这苦短的人生中,追求点自己的简单快乐

发表评论

电子邮件地址不会被公开。 必填项已用*标注