Gradle是一款Google推出的 基于JVM、 通用灵活的 项目构建工具, 支持Maven,JCenter多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml文件,转而使用 简洁的 、 支持多种语言 (例如:java、groovy等)的 build脚本文件 。
为什么学习 Gradle
- Gradle基于Groovy语言,提供了丰富且简洁的语法,甚至可以像写代码一样在Gradle的脚本文件中编写对应的语句执行对应的操作。
- 在脚本文件build.gradle中,可以根据约定进行配置,简洁易读
- 总结一下,就是很灵活,可扩展性和定制化比较好
mark一下:spring framework就是使用gradle构建的
常见的构建工具有 Ant、maven 等。但它们都有一些缺点:
Ant 的缺点:依赖管理较弱,很容易变臃肿, XML 作为构建脚本
Maven 的缺点:比较精简,但限制性太多,编写插件扩展麻烦,XML 作为构建脚本。
由于 Gradle 是基于 Groovy,所以要学习 Gradle,必须要掌握一定的 Groovy 基础。
Groovy
Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该中语言不必编写过多的代码,同时又具有闭包和动态语言中的其它特性。
基础
构建块:
Gradle构建中两个基本概念是项目(project)和任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其它项目,类似的,任务可以形成一个依赖关系图来确保他们的执行顺序。
任务(task):
任务对应org.gradle.api.Task。主要包括任务动作和任务依赖。任务动作定义了一个最小的工作单元。可以定义一路于其它任务、动作序列和执行条件。
方法:
- dependsOn
- doFirst、doLast
自定义任务:
def createDir = {
path ->
File dir = new File(path);
if(!dir.exists()){
dir.mkdirs();
}
}
task makeJavaDir(){
def paths = ['src/main/java','src/main/resources','src/test/java'];
doFirst{
path.forEach(createDir);
}
}
task makeWebDir(){
dependsOn 'makeJavaDir'
def paths = ['src/main/webapp','src/test/webapp'];
deLast {
paths.forEach(createDir)
}
}
构建生命周期:
初始化->配置->执行
依赖管理:
几乎所有的基于JVM的软件项目都需要依赖外部类库来重用现有的功能。自动化的依赖管理可以明确依赖的版本,可以解决因传递依赖带来的版本冲突。
工件坐标:
- group、name、version
常用仓库: - mavenLocal/mavenCentral/jcenter
- 自定义maven仓库
- 文件仓库
依赖的传递性
依赖阶段关系:
repositories {
// Use 'jcenter' for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
dependencies {
// The production code uses the SLF4J logging API at compile time
compile 'org.slf4j:slf4j-api:1.7.21'
// Declare the dependency for your favourite test framework you want to use in your tests.
// TestNG is also supported by the Gradle Test task. Just change the
// testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
// 'test.useTestNG()' to your build script.
testCompile 'junit:junit:4.12'
}
解决版本冲突:
- 查看依赖报告
- 排除传递性依赖
- 强制一个版本
修改默认解决策略:
configurations.all{
resolutionStrategy{
failOnVersionConflict()
}
}
排除传递性依赖
compile('org.hibernate:hibernate-core:3.6.3.Final'){
exclude group:"org.slf.4j",module:"slf4j-api"
//transitive = false
}
强制指定一个版本
configurations.all{
resolutionStrategy{
force 'org.slf4j:slf4j-api:1.7.24'
}
}
多项目构建
项目模块化:在企业项目中,包含次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,比如把业务逻辑和数据持久化拆分开来。项目符合高高内聚低耦合时,模块化就变的很容易,这个一条非常好的软件开发实践。
rootProject.name = 'todo'
include 'respository'
include 'model'
include 'web'
Gradle测试
自动化测试:一些开源的测试框架比如JUnit,TestNG能够帮助你编写可复用的结构化的测试,为了运行这些测试,你要先编译它们,就像编译源代码一样。测试代码的作用仅仅用于测试的情况,不应该被发布到生产环境中,需要把源代码和测试代码分开来。
测试发现:
- 继承自junit.framework.TestCase或groovy.util.GroovyTestCase的类
- 任何被@RunWith注解的类
- 任何至少包含一个被@Test注解的类
发布:
apply plugin: 'maven-publish'
publishing {
publications {
myPublish(MavenPublication){
from components.java
}
}
repositories {
maven {
name "myRepo"
url "私服"
}
}
}
Gradle的学习有很多知识点需要深入,本文只是从它的背景出发,了解Gradle。
网上关于 Gradle 的教程很多,但很多都是以“面”切入— 通过大量讲解其用法及其 API 分类来阐述。但 Gradle API 使用技巧众多,API 更是成千上百,臣妾记不住呀。个人深信,技术之道与练功之道是一致的,“想要旷世武功,先练内功”。本文尝试以“点”切入,阐述一下学习 Gradle 的门路。整合资料《Gradle学习手册》需要可点击领取。部分截图如下:
结尾
Gradle不仅是目前Android最主流的构建工具。而且不少技术领域如组件化、插件化、热修复,及构建系统(很多优秀的框架都是在编译时或者打包之前做一些特殊的处理),都需要通过Gradle来实现,不懂Gradle将无法完成上述事情,所以学习Gradle非常必要