Gradle
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。
Gradle安装
官网:https://gradle.org/
Gradle安装要先安装jdk,然后配置环境变量。
Groovy
Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该中语言不必编写过多的代码,同时又具有闭包和动态语言中的其它特性。
与Java比较:
- Groovy完全兼容Java的语法
- 分号是可选的
- 类、方法默认是public的
- 编译器给属性自动添加getter/setter方法
- 属性可以直接用点号获取
- 最后一个表达式的值会被作为返回值
- ==等同于equals(),不会有NullPointerException
高效特性:
- assert语句
- 可选类型定义
- 可选的括号
- 字符串
- 集合API(List,Map)
- 闭包
基础
构建块:
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 "私服"
}
}
}