gradle实践

之前写过一篇maven实践的博客,随着gradle的流行(spring的最新版本也使用了gradle来构建了),有必要学习一下gradle的使用。此处记录一下gradle的一些常用方式

手动安装gradle

  1. 下载gradle二进制包,之后解压到你的安装目标目录
  2. 配置环境变量GRADLE_HOME为你安装的目标目录
  3. 添加PATH
  4. 验证:gradle -v

gradle wrapper

官方推荐使用gradle wrapper的方式来构建gradle项目。gradle wrapper提供一个脚本,它调用gradle的声明版本,构建时会检查本地是否存在gradle对应版本,不存在将下载对应的gradle版本,解压到~/.gradle/wrapper/目录下,作为我们的构建工具。这将减少我们进行安装的工作,以及方便我们使用不同gradle版本来构建项目。

工作流程

gradle wrapper优势

  • 在给定的gradle版本上标准化项目,从而实现更可靠和强大的构建
  • 为不同用户和执行环境提供新的gradle版本就像更改wrapper定义一样简单,方便不同项目使用不同gradle版本的管理

使用

  1. 生成一个使用gradle wrapper方式管理的项目时,环境下需要安装对应的gradle版本,可参考官方手动安装的方式,先安装gradle
  2. 在项目中生成所需的gradle wrapper文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gradle wrapper

    # 生成后的目录结构
    gradlewrapper-demo/
    ├── gradle
    │   └── wrapper
    │   ├── gradle-wrapper.jar
    │   └── gradle-wrapper.properties
    ├── gradlew
    └── gradlew.bat
  3. 使用gradle wrapper

    1
    ./gradlew build

如果当前环境下,gradle wrapper对应的gradle二进制包在gradle user home(为~/.gradle目录)下不存在时,将触发下载文件到gradle user home

  1. 升级gradle wrapper版本
    1
    2
    # 升级到4.2.1版本
    ./gradlew wrapper --gradle-version 4.2.1

gradle常用的一些配置

定义仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 定义仓库,解析依赖时,gradle内部使用顺序短路来加载
repositories {
maven {
url "http://tools-nexus.188w.com/repository/maven-central/"
// 如果私服需要账号密码才能访问,为了安全起见,需要把账号密码配置在~/.gradle/gradle.properties文件中,之后再此处引用变量的值
credentials {
username "$NEXUS_USERNAME"
password "$NEXUS_PASSWORD"
}
}
maven {
url "http://tools-nexus.188w.com/repository/android-maven-release/"
credentials {
username "$NEXUS_USERNAME"
password "$NEXUS_PASSWORD"
}
}
maven {
url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
}
mavenCentral()
}

定义依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 定义依赖的版本号
ext {
var = [
springVersion: '4.3.20.RELEASE',
slf4jVersion: '1.7.25'

]
}

// 使用ext定义的变量来统一管理依赖版本号
dependencies {
compile "org.springframework:spring-core:$var.springVersion"
compile "org.slf4j:jcl-over-slf4j:$var.slf4jVersion"
compile "org.slf4j:slf4j-api:$var.slf4jVersion"
}

版本冲突解决

  • 查看依赖报告,gradle在遇到版本冲突,默认使用最新版本。可以修改策略为快速失败策略

    1
    2
    3
    4
    5
    6
    // 修改默认解决策略,改为快速失败。如果存在冲突则打印依赖报告
    configurations.all {
    resolutionStrategy {
    failOnVersionConflict()
    }
    }
  • 排除传递性依赖

    1
    2
    3
    compile ('org.hibernate:hibernate-core:3.6.3.Final') {
    exclude group:'org.slf4j', module:'slf4j-api'
    }
1
2
3
4
// 定义全局exclude的依赖
configurations {
compile.exclude group:'commons-logging', module:'commons-logging'
}
  • 强制一个版本
    1
    2
    3
    4
    5
    configurations.all {
    resolutionStrategy {
    force 'org.slf4j:slf4j-api:1.7.24'
    }
    }

发布构件到maven仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// publish到maven的插件
apply plugin: 'maven-publish'

// publish插件配置
publishing {
// 定义要publish的构件,此处为myPublish。构件为jar包形式
publications {
myPublish(MavenPublication) {
from components.java // jar包形式
// from components.web // war包形式,使用这个配置需要增加war插件
}
}
// 定义publish的仓库
repositories {
maven {
name = 'corp-releases'
url = "http://tools-nexus.188w.com/repository/maven-releases/"
// 账号密码
credentials {
username "$NEXUS_USERNAME"
password "$NEXUS_PASSWORD"
}
}
}
}

多项目构建

在root项目中的settings.gradle中定义子模块
1
2
3
4
5
6
// root project的名称
rootProject.name = 'multi-project-demo'
// 包含的sub-project
include 'modle'
include 'repository'
include 'web'
在root项目中的build.gradle中定义通用配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
allprojects {
repositories {
// 按短路顺序寻找依赖
// 定义私服
// maven {
// url ''
// }
mavenCentral()

}

apply plugin: 'java'
sourceCompatibility = 1.8
}

// 定义子模块
subprojects {
dependencies {
compile group: 'org.projectlombok', name: 'lombok', version: '1.18.2'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
}
项目之间的依赖定义
1
2
3
4
dependencies {
// 引用依赖子模块
compile project(":modle")
}
可以将通用的变量放到root project中的gradle.properties
1
2
group = 'com.luhc.gradle'
version = '1.0-SNAPSHOT'