新一代构建工具Gradle(二)
构建脚本的概要
Gradle构建中的两个基本概念是项目(Project)和任务(Task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖其他项目;类似的,任务可以形成一个依赖关系图来确保他们的执行顺序。
项目(Project)
一个项目代表一个正在构建的组件(比如一个jar文件),当构建启动后,Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project使其隐式可用。
属性
- group、name、version
方法
- apply、dependencies、repositories、task
- 属性的其他配置方式:ext、gradle.properties
任务(Task)
任务对应org.gradle.api.Task。主要包括任务动作个任务依赖。任务动作定义了一个最小的工作单元。可以定义依赖于其他任务、动作序列和执行条件。
- dependsOn
- doFirst、doLast<<
自定义任务--创建一个目录结构
在build.gradle中编写
//自定义任务
def createDir={
path->
File dir = new File(path);
if(!dir.exists()){
dir.mkdirs();
}
}
task makeJavaDir(){
def paths=['src/config'];
doFirst{
paths.forEach(createDir);
}
}
构建生命周期
初始化 ---> 配置--->执行
依赖管理
概述
几乎所有的基于JVM的软件项目都需要依赖外部类库来重用现有的功能。自动化的依赖管理可以明确依赖的版本,可以解决因传递性依赖带来的版本冲突。
依赖的传递性
自动化依赖管理
依赖管理阶段配置
- 源代码的两个阶段: compile、runtime
- 测试代码的两个阶段 :testCompile、testRuntime
依赖阶段关系
解决版本冲突
- 查看依赖报告
- 排除传递性依赖
- 强制指定一个版本
具体解决方案:
- 修改默认解决策略---------只要一遇到版本冲突就报错误
configurations.all{
resolutionStrategy{
failOnVersionConflict();
}
}
- 强制指定一个版本
configurations.all{
resolutionStrategy{
force 'org.slf4j:slf4j-api:1.7.24'
}
}
多项目构建
在企业项目中,包层次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,比如把业务逻辑和数据持久化划分来。项目符合高内聚低耦合时,模块化就变得很容易,这是非常好的软件开发实践的方法。
- 项目模块化
- TODO模块依赖关系
- 配置子项目----配置要求
- 所有项目应用Java插件
- web子项目打包成war包
- 所有项目添加logback日志功能
- 统一配置公共属性
比如说respository这个子项目需要依赖modle的支持,web需要respository的支持,所以就需要进行配置
在respository中的build.gradle中配置
dependencies {
//依赖modle
compile project(":modle");
testCompile group: 'junit', name: 'junit', version: '4.12'
}
在web中的build,gradle中配置
dependencies {
//依赖respository
compile project(":repository")
testCompile group: 'junit', name: 'junit', version: '4.12'
}
所以就可以看得见他们是层级的依赖关系
总结
gradle构建项目流程:
新建项目(IDE快速新建)->开发(gradle配置依赖)->测试(gradle自动测试)->打包(gradle插件自动打包)->发布(gradle插件自动发布)