学习使用Gradle
构建Java项目使用什么?
- Ant, 比较老了,个人用的不多,但是给我的感觉是用起来很灵活,没那么多条条框框,想怎么扩展怎么扩展
- Maven 绝对是目前使用最多的:Repository Centre,依赖管理,使用起来也很方便,但是要扩展的时候就稍微有些麻烦
- 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也几乎不会是一个问题。
参考: