gradle 入门介绍
gradle 简介
基于Groovy实现的自动化构建工具,比maven好的一点在于不用写复杂的xml文件。使用script就可以。
gradle 专业名词
从一个build.gradle 文件开始,build.gradle 文件就是maven中pom.xml
buildscript {
repositories {
mavenCentral()
maven {
url 'file:local_repo'
}
}
dependencies {
classpath group: 'test', name: 'build-plugin',
version: '1.0'
}
}
apply plugin: 'com.stone.build'
plugins {
id "net.saliman.cobertura" version "2.3.2"
}
subprojects { subproject ->
apply plugin: 'eclipse'
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencyManagement {
dependencies {
//common dependency
dependency "commons-io:commons-io:$COMMON_VERSION"
}
}
dependencies {
compile 'commons-io:commons-io'
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
buildscript
buildscript 中指定当前这个build.gradle 的执行环境。
repository 指定当需要下载依赖时查找的中心库
apply plugin 引用gradle插件,gradle有很多已有的plugin。或者你可以定制一个。查询已有的pluginhttps://plugins.gradle.org
plugins apply plugin 的简化写法,gradle 2.1 中引入的。没必要再写dependency,然后使用apply plugin 引入
subproject 定义子project的共同行为
dependencyManagement 当有多个project,各个project有一些共同的jar包依赖。在这边声明jar包的统一版本.
这边只是声明,并没有引入,需要在dependencies中引入。如果在dependencies中没有定义jar包版本,则继承dependcyManagement中的jar包版本。否则会覆盖
dependencies 工程依赖的jar包
wrapper 指定project 运行的gradle 版本。生成gradlew 可执行文件。运行./gradlew build时会去下wrapper task 中指定的gradle 版本。这样可以运行在没有安装gradle 的环境。当然如果你的环境中已经安装了gradle,而且可以运行project.可以直接使用gradle build命令。
gradle 常见命令
gradle buildEnvironment 查看build script 块中定义的dependencies
gradle -q dependencies $subprojectname:dependencies
列出subproject 的包依赖
gradle plugin开发
gradle 支持自定义plugin。开发很简单。实现Plugin 即可。
https://github.com/davenkin/gradle-learning/tree/master/10-custom-plugin
这边主要介绍另外一种,将task与project 解耦的方法。
定义task
继承DefaultTask,然后在@TaskAction 方法中定义Task执行的具体任务
package davenkin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class ShowTimeTask extends DefaultTask {
@TaskAction
def showTimeTask(){
println "Current time is " + new Date().format(project.dateAndTime.timeFormat)
}
}
向project中注入task
plugin实现Plugin,然后通过project.task注入。
package davenkin
import org.gradle.api.Plugin
import org.gradle.api.Project
import davenkin.ShowTimeTask
import davenkin.ShowDateTask
class DateAndTimePlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("dateAndTime", DateAndTimePluginExtension)
project.task('showTime', type: ShowTimeTask);
project.task('showDate', type: ShowDateTask);
}
}
plugin publish
artifactory {
clientConfig.setIncludeEnvVars(true)
contextUrl = 'http://localhost:8081/artifactory/'
publish {
repository {
repoKey = 'libs-release-local'
username = "admin"
password = "password"
}
}
}
publishing {
publications {
mavenJar(MavenPublication) { from components.java }
}
}
artifactoryPublish { publications('mavenJar') }
如果artifactory中没有自定义publications。在artifactory中也可以指定默认的publish内容。
gradle issues
Q1: gradle设置多个repo,不生效,只会找最上面的一个repo
A1: 将多个url分开写。将mavenCentral()放在最上面
mavenCentral()
maven { url }
maven { url ‘file:local_repo’}
参考
https://plugins.gradle.org
https://docs.gradle.org/current/userguide/custom_plugins.html
https://plugins.gradle.org/plugin/net.saliman.cobertura
http://buransky.com/scala/publish-jar-artifact-using-gradle-to-artifactory/