学习使用Gradle

Raven's Blog

Home Page View on GitHub Send Email

学习使用Gradle

构建Java项目使用什么?

  1. Ant, 比较老了,个人用的不多,但是给我的感觉是用起来很灵活,没那么多条条框框,想怎么扩展怎么扩展
  2. Maven 绝对是目前使用最多的:Repository Centre,依赖管理,使用起来也很方便,但是要扩展的时候就稍微有些麻烦
  3. Gradle 比较新的东西,结合了Ant和Maven的优点,所以我打算好好学习学习;做技术的也要与时俱进嘛,新的技术能够出现就一定有比旧技术先进的地方:)

Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。

Gradle是一个构建工具,jar包仓库和依赖管理可以与Maven共用

安装

目前最新版2.5,下载地址:https://services.gradle.org/distributions/gradle-2.5-all.zip 解压,配置环境变量,gradle -v 成功搞定!

开始:创建基于Gradle的Java项目

用过Maven都知道,可以使用maven命令直接创建出项目的目录结构,但是gradle不像maven那样有固定的项目结构,gradle原生API是不支持的,要想做到这一点,我们可以自定义一个task。 创建一个目录,作为项目的根目录,然后新建一个build.gradle文件:


//build.gradle
apply plugin: 'java'    //使用java插件,默认提供build等task

task 'initproject' << { //自定义的task
    sourceSets*.java.srcDirs*.each{it.mkdirs()}
    sourceSets*.resources.srcDirs*.each{it.mkdirs()}
}

随后使用命令:gradle initproject,即可创建好和Maven项目一致的目录结构了

自定义task

在Gradle中可以很方便的自定义task,就像上面的代码中我们就自定义了一个initproject。 并且多个task之间可以声明依赖关系:


//build.gradle
defaultTasks 'taskB', "taskC"   //默认task(命令行中只输入gradle时先后执行 taskB taskC)
task taskA << {             //自定义taskA
    println "I'm task A"
}
task 'taskB' << {               //自定义taskB
    println "I'm task B"
}
task "taskC" << {               //自定义taskC
    println "I'm task C"
}
taskB.dependsOn taskA

命令行中直接输入:gradle,会先执行taskB(由于taskB依赖taskA,所以在taskB执行之前先执行taskA),然后执行taskC

依赖管理和集成Maven仓库

如果我们需要在Gradle项目中使用Maven仓库并管理依赖,该如何配置呢:


//build.gradle
apply plugin: 'java'

repositories {
    //Maven中心库(http://repo1.maven.org/maven2)
    mavenCentral()

    //本地库,local repository(${user.home}/.m2/repository)
    mavenLocal()

    //指定库
    //maven {
    //    url "http://repo.mycompany.com/maven2"
    //}

    //指定库
    //mavenRepo name: reponame', url: "http://repo.mycompany.com/maven2"

    //指定库
    //maven {
    //   // Look for POMs and artifacts, such as JARs, here
    //    url "http://repo2.mycompany.com/maven2"
    //   // Look for artifacts here if not found at the above location
    //    artifactUrls "http://repo.mycompany.com/jars"
    //    artifactUrls "http://repo.mycompany.com/jars2"
    //}

    //带认证的库
    //maven {
    //    credentials {
    //        username 'user'
    //        password 'password'
    //    }
    //    url "http://repo.mycompany.com/maven2"
    //}
}

//依赖管理,有多重写法
dependencies {
    compile group:'org.springframework', name:'spring-core',version:'2.5.6'
    compile 'org.springframework:spring-beans:2.5.6'
    compile 'org.springframework:spring-context:2.5.6'
    //compile (
    //  [group:'org.springframework', name:'spring-beans', version:'2.5.6'],
    //  [group:'org.springframework', name:'spring-context', version:'2.5.6']
    //)
    //
    //compile 'org.springframework:spring-beans:2.5.6', 'org.springframework:spring-context:2.5.6'
    compile('com.google.code.kaptcha:kaptcha:2.3:jdk15')
    testCompile 'junit:junit:4.7'
}

如果将Gradle项目发布到Maven仓库呢?


apply plugin: 'maven'

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

在上传的过程中,Gradle能够基于build.gradle生成对应的Maven POM文件,用户可以自行配置POM信息,比如这里的groupId和artifactId,而诸如依赖配置这样的内容,Gradle是会自动帮你进行转换的。由于Maven项目之间依赖交互的直接途径就是仓库,而Gradle既能够使用Maven仓库,也能以Maven的格式将自己的内容发布到仓库中,因此从技术角度来说,即使在一个基于Maven的大环境中,局部使用Gradle也几乎不会是一个问题。


参考:

联系作者:aducode@126.com
更多精彩文章请点击:http://aducode.github.io