Gradle快速入门

Gradle快速入门

概述

Gradle是基于Groovy的基于java应用构建工具。按照过程请参考官网

构建块——项目和任务

在Gradle中,构建包括一个多个项目,每个项目有一个多个任务组成。
gradle中项目可以被打包成jar、war或zip文件。任务是一件单独的工作。可以包括编译类,或者创建和发布Java/web应用。简单的任务可以定义为:

task hello {
    doLast {
        println 'Baeldung'
    }
}

如果我们build.gradle目录下执行命令gradle -q hello,运行上面任务,在控制台中可以看到输出。

任务

gradle构建脚本完全是groovy语法:

task toLower {
    doLast {
        String someString = 'HELLO FROM BAELDUNG'
        println "Original: "+ someString
        println "Lower case: " + someString.toLowerCase()
    }
}

也可以定义任务依赖其他任务。语法为:dependsOn: taskName 。

task helloGradle {
    doLast {
        println 'Hello Gradle!'
    }
}

task fromBaeldung(dependsOn: helloGradle) {
    doLast {
        println "I'm from Baeldung"
    }
}

给任务增加行为

定义任务是可以给其增加额外行为:

task helloBaeldung {
    doLast {
        println 'I will be executed second'
    }
}

helloBaeldung.doFirst {
    println 'I will be executed first'
}

helloBaeldung.doLast {
    println 'I will be executed third'
}

helloBaeldung {
    doLast {
        println 'I will be executed fourth'
    }
}

doFirst和doLast动作分别增加在动作列表的顶部和底部,另外每个任务可以增加多次doFirst和doLast。

增加任务属性

可以给任务定义属性:

task ourTask {
    ext.theProperty = "theValue"
}

这里给outTask任务设置“theValue”属性。

管理插件

有两种类型的gradle插件——脚本代码和二进制形式。每个插件需要经历两个阶段:解析与应用。解析即发现合适的插件jar版本,并增加至项目类路径中。应用插件即在项目上执行Plugin.apply(T) 。

应用脚本插件

在aplugin.gradle中可以定义任务:

task fromPlugin {
    doLast {
        println "I'm from plugin"
    }
}

如果我们在我们的项目build.gradle文件中应用该插件,通过下面代码进行引用:
apply from: ‘aplugin.gradle’

现在执行 gradle tasks命令任务列表中应该显示“fromPlugin”任务。

通过二进制插件使用DSL

增加核心二进制插件,可以通过名称或ID:

plugins {
    id 'application'
}

现在,应该可以在项目中通过application plugin的run任务执行任何可运行jar。如果使用社区插件,需要提供完整插件id:

plugins {
    id "org.shipkit.bintray" version "0.9.116"
}

上述代码引用shipkit插件,其所有任务会出现在gradle的任务列表中。

DSL插件有一些限制:

  • 插件块中不支持Groovy脚本
  • 插件块需要在项目构建脚本的顶部(仅buildscripts{} 块可以在其之前)
  • DSL插件不能写在脚本插件、settings.gradle或初始化脚本中

DSL插件仍在孵化阶段,DSL和其他相关配置在未来gradle版本中可能会改变。

传统使用插件过程

使用“apply plugin”方式:

apply plugin: 'war'

如果你想使用社区插件,需要在buildscript{}块中 增加外部jar,然后可以在构建脚本中应用插件,但必须在任何已经存在的plugins{}块之后:

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "org.shipkit:shipkit:0.9.117"
    }
}
apply plugin: "org.shipkit.bintray-release"

依赖管理

Gradle支持非常灵活的依赖管理系统,它与各种可用的方法兼容。
Gradle中依赖管理的最佳实践是版本控制、动态版本控制、解决版本冲突和管理传递依赖。

依赖配置

依赖被分为不同的配置组,每个配置有名称及依赖项。如果我们使用java插件,则会有compile, testCompile, runtime 配置可以给我们依赖进行分组。缺省配置扩展 runtime。

声明依赖

下面示例使用不同的方式增加(spring和Hibernate):

dependencies {
    compile group: 
      'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'
    compile 'org.springframework:spring-core:4.3.5.RELEASE',
            'org.springframework:spring-aop:4.3.5.RELEASE'
    compile(
        [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'],
        [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE']
    )
    testCompile('org.hibernate:hibernate-core:5.2.12.Final') {
        transitive = true
    }
    runtime(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') {
        transitive = false
    }
}

上面代码通过不同的配置compile、testCompile、runtime进行依赖声明。有时需要依赖多个工件,我们也可以增加特定工件通过@extensionName(或ext方式):

runtime "org.codehaus.groovy:groovy-all:2.4.11@jar"
runtime group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.11', ext: 'jar'

这里我们使用@jar符合仅下载jar工件。

如果增加本地文件依赖,语法格式如下:

compile files('libs/joda-time-2.2.jar', 'libs/junit-4.12.jar')
compile fileTree(dir: 'libs', include: '*.jar')

如果需要避免传递依赖,可以在配置级别或依赖级别进行配置:

configurations {
    testCompile.exclude module: 'junit'
}

testCompile("org.springframework.batch:spring-batch-test:3.0.7.RELEASE"){
    exclude module: 'junit'
}

多项目构建

构建声明周期

初始化阶段,gradle决定哪些项目参与多项目构建。一般在settings.gradle文件中定义,其位于根项目中,gradle也创建参与项目的实例。

在配置阶段,在配置阶段,所有创建的项目实例都需要基于Gradle特性配置进行配置。

最后在执行阶段,一组被创建和配置的任务开始执行。我们能在settings.gradle 和 build.gradle 文件中增加这三个阶段的代码。

settings.gradle :

println 'At initialization phase.'

build.gradle :

println 'At configuration phase.'

task configured { println 'Also at the configuration phase.' }

task execFirstTest { doLast { println 'During the execution phase.' } }

task execSecondTest {
    doFirst { println 'At first during the execution phase.' }
    doLast { println 'At last during the execution phase.' }
    println 'At configuration phase.'
}

创建多项目构建

我们可以在根目录中执行gradle init 命令创建两个文件框架:settings.gradle 和 build.gradle .
根构建脚本生成一些通用配置:

allprojects {
    repositories {
        mavenCentral() 
    }
}

subprojects {
    version = '1.0'
}

setting文件中也需要博阿凯根项目和子项目:

rootProject.name = 'multi-project-builds'
include 'greeting-library','greeter'

现在我们需要有两个子项目文件夹来演示多项目构建:’greeting-library’,’greeter’。每个子项需要有各自的构建脚本来排至各自依赖和其他必要的配置。

如果greeter项目依赖greeting-library项目,我们需要在greeter构建脚本中包括相应依赖。

dependencies {
    compile project(':greeting-library') 
}

使用Gradle包装器

如果gradle项目有gradlew文件(linux为gradlew.sh,windows为gradlew.bat),我们不需要安装gradle去构建项目。

当执行gradlew构建项目(windows为 gradlew,linux为./gradlew),gradle特定发布包将被自动下载。通过下面脚本增加gradle包装器至项目中:

gradle wrapper --gradle-version 4.2.1

命令需要在根项目中执行,这将创建所有必要的文件和文件夹,以便将Gradle包装器与项目绑定在一起。另一种方法是将包装器任务添加到构建脚本中:

task wrapper(type: Wrapper) {
    gradleVersion = '4.2.1'
}

执行包装器任务将把我们的项目与包装器绑定在一起。除了gradlew文件之外,在gradle文件夹中还会生成一个包装器文件夹,其中包含一个jar和一个属性文件。

如果要切换到新版本Gradle,我们只需要修改grad-wrapper.properties中的内容。

总结

本文我们了解Gradle,相比其他构件工具更强大的版本冲突及传递依赖管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值