新一代构建工具:Gradle
Gradle 是什么
Gradle 是新一代的项目构建工具,是建立在 Ant 和 Maven 的基础上创建,不再使用 xml 标记语言,而是使用 Groovy 特定的 DSL 语言
Gradle 安装
-
下载 Gradle
https://gradle.org/ -
配置环境变量
- GRADLE_HOME Gradle 的解压根目录
- Path Gradle 下的 bin 目录
使用 idea 创建一个 Gradle 项目
选择 Gradle,SDK,勾选语言
填写 GroupId,ArtifactId,Version
选择 Gradle 安装目录,选择 JDK
填写项目名,项目地址
创建完成后,项目的文件结构为
构建脚本 Groovy 简要说明
// Java 项目
plugins {
id 'java'
}
// 组名
group 'xyz.snowflake'
// 版本
version '1.0-SNAPSHOT'
// 源代码兼容版本
sourceCompatibility = 1.8
// 仓库
repositories {
// 本地仓库
mavenLocal()
// 中央仓库
mavenCentral()
}
// 依赖
dependencies {
// 测试编译依赖
testCompile group: 'junit', name: 'junit', version: '4.12'
// 编译依赖
// compile
// compile group: 'org.hibernate', name: 'hibernate-core', version: '5.4.2.Final'
}
构件块
Gradle构建中的两个基本概念是项目(project)和任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个关系图来确保他们的执行顺序
项目
- group 组
- name id
- version 版本
- apply 添加插件 例如 jar, war
- dependencies 依赖 例如:junit
- task 添加任务动作
- ext
- gradle.properties 属性的其他配置方式
构建生命周期
- 初始化 -> 有哪些项目
- 配置 -> 用来生成 task 的依赖顺序
- 执行 -> 执行 task的 动作代码
依赖管理
用来自动化管理依赖包以及解决依赖之间的冲突
常用的仓库
- mavenLocal 本地maven仓库
- mavenCentral/jcenter maven中央仓库
- 自定义仓库 公司中的仓库
- 文件仓库(不建议)
maven仓库的写法
//本地仓库:
mavenLocal()
//中央仓库:
mavenCentral()
//自己仓库:
maven {
url ''
}
依赖的传递性
解决冲突的步骤
- 查看依赖报告
- 排除传递性依赖
- 强制使用一个版本
解决传递依赖的方法
-
排除传递性依赖
- 排除某一个传递依赖
compile group: ('org.hibernate', name: 'hibernate-core', version: '5.4.2.Final') { // modul 就是 name 属性 exclude group:'org.slf4j', modul:'slf4j-api' }
- 排除所有的传递依赖
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.4.2.Final' { transitive = false }
-
gradle 默认会选择高版本的 jar 包
// 可以改变默认的传递依赖处理策略
configurations.all {
resolutionStrategy {
// 当出现传递依赖时,会报错
failOnVersionConflict()
// 当出现传递依赖时,会强制使用某一个版本
force 'org.slf4j:slf4j-api:1.7.24'
}
}
多项目的构建
构建一个项目 todo
模块之间的依赖关系
项目构建完成后
项目之间的范围
allprojects {
root
model
web
repository
}
subprojects {
model
web
repository
}
所有的项目只比子项目多了一个 root 模块
repositoy 依赖于 model 模块
dependencies {
compile project(':model')
testCompile group: 'junit', name: 'junit', version: '4.12'
}
web 模块依赖于 repository 和 model 模块,由于依赖的传递性,所以 web 模块只依赖于 repository 模块即可
dependencies {
compile project(':repository')
testCompile group: 'junit', name: 'junit', version: '4.12'
}
项目的依赖关系
settings.gradle 文件
rootProject.name = 'test-gradle'
include 'model'
include 'web'
include 'repository'
实现几个功能
-
所有项目中应用 java 插件
allprojects { apply plugin: 'java' }
-
web 子项目打包成 jar
apply plugin: 'war'
-
所有项目添加 logback 日志功能
allprojects { apply plugin: 'java' dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' } }
-
统一配置 group 和 version
新创建一个文件 gradle.properties [文件名必须是这个]
group = xyz.snowflake version = 1.0-SNAPSHOT
Gradle 测试
Gradle会自动发现需要测试的方法,并在构建时执行
- 任何继承自 junit.framework.TestCase 或 groovy.util.GroovyTestCase的类
- 任何被 @RunWith注解的类
- 任何至少包含一个 @Test 注解的类