Gradle学习:创建任务、依赖管理、多项目构建
目录
-
创建gradle项目
1.首先在IDEA中创建一个gradle的Java工程,IDEA会自动初始化工程目录以及相应的配置文件,其目录结构如下:
2.setting.gradle作用:该文件可以看做是子工程(即:Module)的配置文件,该setting文件在初始化的时候就会被执行,该文件中定义了哪些module应该被加入编译过程,对于只有一个module的项目,该文件没有什么作用,但对于包含多个module的项目,其作用就极其重要了,缺少该文件项目在启动的时候就不知道要加载哪些module;
rootProject.name = 'todo'
3.build.gradle作用:该文件也可看做module的配置文件,我们可以在该文件中配置插件、版本、依赖库等等的信息;对于包含多个module的project,每个module都有自己的build.gradle文件,同时整个project也会有一个build.gradle文件,该文件中定义的信息会被应用到所有的module中;
group 'com.thoughtworks'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
Gradle添加插件
需求:通过修改build.gradle文件,添加自动将project打包成war包的插件;
做法:只需要在build.gradle文件中添加一行如下代码即可;
apply plugin: 'war'
添加完成之后可以发现,在gradle视图中已经多出了一个war选项,点击该选项即可将project打包成war包;
-
gradle中相关名词
1.group、name、version:group是module所在组;name是module的名字,同一个组里name具有唯一性;version是module的版本号;group、name和version三者构成了该module的唯一性;
2.apply:在module中应用一个插件;
3.dependencies:用来声明module所依赖的jar包或其他module;
4.repositories:声明一个仓库,告诉程序到哪个仓库去找相应的module、jar包等依赖;
5.task:用来声明module的任务,其对应org.gradle.api.Task。
-
任务(task)
1.任务主要包括任务动作和任务依赖。
任务动作:定义了一个最小的工作单元;
任务依赖:定义了所依赖的其他任务、动作序列和执行条件等;
2.dependsOn:用于声明任务依赖;
3.doFirst:在动作列表前面添加一个动作;
4.doLast:在动作列表后面添加一个动作,一个动作列表中可以添加多个doFirst和doLast;
5.<<:doLast的简写;
-
gradle项目
一个项目就代表一个正在构建的组件(比如一个jar文件),当构建启动后,Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且通过project变量使其隐式可见。
因此build.gradle中的写法都是Groovy的简写(对于Groovy不明白的,可以参考上一篇博文:Groovy基础知识介绍),其还可以换种写法如下:
group 'com.thoughtworks'
project.version = '1.0-SNAPSHOT'
apply plugin: 'java'
project.apply plugin: 'war'
点击任意字段进入源码中,可以看到group、version、apply、repositories等都是org.gradle.api.Project类中定义的方法;
-
自定义任务
1.需求:自定义一个自动创建Java工程目录的任务,当目录存在时不进行创建,不存在时进行创建;
2.在build.gradle中创建任务:makeJavaDir
// 创建闭包
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', 'src/test/resources']
// 在任务列表前添加一个任务
doFirst {
paths.forEach(createDir)
}
}
3.运行task后,在gradle视图中的other下面的任务列表中就会多一个makeJavaDir的任务选项;双击makeJavaDir即可执行该任务;
-
依赖管理
1.工件坐标:可以理解为jar包,由group、name和version三者确定;
2.常用仓库:
mavenLocal:本地maven仓库,本地下载的jar包通常都放在这里;
mavenCentral/jenter:公用的仓库;build.gradle里就配置了公用仓库:
repositories {
mavenCentral()
}
自定义maven仓库:最常用的仓库也叫作私服,通常是公司内部搭建的为了方便公司内部管理jar包;
注意:如果配置了多个仓库,那么按照仓库的顺序进行查找,当找到所需要的依赖之后就不在查找;
3.依赖关系:A依赖于B,B依赖于C,那么A也依赖于C;
4.依赖阶段配置:
运行时依赖:compile、runtime:编译时依赖的运行时一定依赖,运行时依赖的编译时不一定依赖;
测试时依赖:testCompile、testRuntime:源码依赖的测试时一定依赖,测试时依赖的源码不一定依赖;
5.依赖写法:下面这个junit的测试时依赖由group、name、version三者组成,通过这三个字段在仓库中查找唯一的jar包;
testCompile group: 'junit', name: 'junit', version: '4.12'
// group name version可以省略,用冒号代替
testCompile 'junit:junit:4.12'
-
多项目构建
1.创建model、repository、web三个子项目;
// 模块创建完成后settings.gradle文件中会自动配置所有模块信息
rootProject.name = 'todo'
include 'Model'
include 'Repository'
include 'Web'
2.创建模块依赖关系:repository依赖model,同时web依赖repository。
// 在子模块的build.gradle中添加Repository或者model依赖
dependencies {
compile project(":Repository")
}
3.在根目录中添加所有项目的Java依赖;
// 在根目录下的build.gradle中添加所有项目的Java依赖
allprojects {
apply plugin: 'java'
sourceCompatibility = 1.8
}
4.给所有子项目添加Junit和logback的依赖;
// 在根目录的build.gradle中添加所有子项目的logback和Junit依赖
subprojects {
repositories {
mavenCentral()
}
dependencies {
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
testCompile 'junit:junit:4.12'
}
}
5.在web项目中添加war插件;
// 在web项目中添加war插件
apply plugin: 'war'
6.新建gradle.properties文件,统一配置所有项目的版本信息;
group='com.thoughtworks'
version='1.0-SNAPSHOT'
配置完成后跟目录下的build.gradle内容如下:
buildscript {
ext {
springBootVersion = '2.0.4.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
// 配置所有项目的Java依赖
allprojects {
apply plugin: 'java'
sourceCompatibility = 1.8
}
// 配置子项目的Junit依赖
subprojects {
repositories {
mavenCentral()
}
dependencies {
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
testCompile 'junit:junit:4.12'
}
}
repositories {
mavenCentral()
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
小结:
根目录下的build.gradle会对所有模块起作用,如果需要对所有模块进行构建,只需要对根目录进行构建即可;
子模块下的build.gradle只对本模块起作用,如果需要对单个模块进行构建,只需要对该模块进行构建即可;