欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gradle学习:创建任务、依赖管理、多项目构建

程序员文章站 2024-01-13 11:51:34
...

目录

创建gradle项目

Gradle添加插件

gradle中相关名词

任务(task)

gradle项目

自定义任务

依赖管理

多项目构建


  • 创建gradle项目

1.首先在IDEA中创建一个gradle的Java工程,IDEA会自动初始化工程目录以及相应的配置文件,其目录结构如下:

Gradle学习:创建任务、依赖管理、多项目构建

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学习:创建任务、依赖管理、多项目构建

 

  • 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即可执行该任务;

Gradle学习:创建任务、依赖管理、多项目构建


  • 依赖管理

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只对本模块起作用,如果需要对单个模块进行构建,只需要对该模块进行构建即可;