Gradle 总结

Gradle 是基于 Groovy 的构建工具,提供灵活的构建脚本和仓库支持。本文详细介绍了Gradle的基本概念,包括任务(Task)和构建块(Component),仓库管理,如Maven仓库的加入。此外,还讲解了任务依赖、插件应用、依赖配置,包括不同类型的依赖配置项以及如何处理本地和中央仓库以外的依赖。最后提到了Gradle Wrapper的作用和配置项目的完整流程。

Gradle

Gradle是基于groovy,可切换的,像Maven一样基于约定优于配置的构建框架,构建脚本默认为build.gradle


Gradle出现之前Java的三个构建工具:AntGantMaven;

  • 1.Ant是由Java编写的构建工具,它的核心代码是由Java编写的,与平台无关,构建脚本默认为bulid.xml;
  • 2.Gant是一个基于Ant的构建工具,它在Ant的基础上用Groovy写的DSL,构建脚本默认为build.gant;
  • 3.Maven继承了Ant的项目构建功能,具有依赖管理和项目管理的功能,提供了中央仓库,构建脚本默认为pom.xml;

本文基于Gradle 5.5 版本

1 基本概念

1.1设计理念

  • 1.在项目中添加新任务
  • 2.为新加入的任务提供默认配置,这个默认配置会在项目中注入新的约定(如源文件位置)。
  • 3.加入新的属性,可以覆盖插件的默认配置属性。
  • 4.为项目加入新的依赖。

1.2 基本概念

Gradle中的两个重要概念:项目任务

  • 1.项目是指我们的构建产物(比如Jar包)或实施产物(将应用程序部署到生产环境)一个项目包含一个或多个任务。
  • 2.任务是指不可分的最小工作单元,执行构建工作(比如编译项目或执行测试)。

在项目目录中的build.gradle指定了一个项目和它的许多子任务

2 仓库

Gradle完全支持用于发布或检索依赖的MavenIvy仓库。
Gradle也会将依赖缓冲在本地中,方便在无网的环境使用,Linux/MacOS下缓存路径为: ~/.gradle
在这里插入图片描述

参考:https://docs.gradle.org/current/userguide/declaring_dependencies.html

2.1 加入Maven仓库

Gradle提供了三种“别名”供我们使用,它们分别是:

  • 1.mavenCentral()别名,表示依赖是从Central Maven 2 仓库中获取的。
  • 2.jcenter()别名,表示依赖是从Bintary’s JCenter Maven 仓库中获取的。
  • 3.mavenLocal()别名,表示依赖是从本地的Maven仓库中获取的。

也可自定义仓库路径:

  • 4.自定义仓库地址的maven仓库,表示依赖是指定URL的Maven仓库中获取的。
repositories {
    mavenCentral()
    jcenter()
    maven {
        url 'http://maven.aliyun.com/nexus/content/groups/public/'
    }
}

注:
mavenCentral()访问的地址为:https://repo1.maven.org/maven2
由于国内网络的问题这个地址经常无法使用,解决办法是把https换成http
maven { url 'http://repo1.maven.org/maven2' }

3 Task

每个项目都由不同的任务组成;
任务是真正做事情的角色,构建过程中的真正执行者

Task做的事情:

  • 编译类
  • 将类文件存储到指定的文件夹中
  • 创建JAR
  • 生成Javadoc或将一些归档发布到存储库

Task执行顺序:

  • 1.任务可能会存在依赖关系
  • 2.用dependsOn让Task有顺序的运行起来

4 插件

插件是一堆Task的集合,用于实现自动化;
所有有用的功能,都是通过插件进行添加的;
编译Java代码为例,Gradle内置了Java插件(它是许多其他Gradle插件的基础)。

Java插件Java编译以及测试捆绑任务添加到项目中,使用Java插件需在build.gradle中加入插件ID:

plugins {
   id 'java'
}

导入了Java插件后,会生成一系列的默认的配置值,并且会导入已编排好的的Task:

compileJava(type: JavaCompile)		//Java 编译
processResources(type: Copy)		//拷贝 Resources 资源
classes(type: Task)			//组装 Java 类
compileTestJava(type: JavaCompile)	//Java Test 编译
processTestResources(type: Copy)	//拷贝 Test Resources 资源
testClasses(type: Task)			//组装 Test 类
jar(type: Jar)				//合成Jar包
javadoc(type: Javadoc)			//生成 doc 文档
test(type: Test)			//运行测试
uploadArchives(type: Upload)		//上传 jar 到仓库
clean(type: Delete)			//clean

5 依赖配置

5.1 依赖配置项
配置名称角色可消耗可分解描述
api声明API依赖项没有没有声明可传递给消费者的依赖项,以便进行编译。
implementation声明实现依赖性没有没有声明纯粹内部的依赖关系,而不是要向消费者公开。
compileOnly声明仅编译依赖项声明仅在编译时需要的依赖项,但不应泄漏到运行时,这通常包括在运行时找到时被着色的依赖项。
runtimeOnly声明运行时依赖项没有没有声明仅在运行时需要的依赖项,而不是在编译时。
testImplementation测试依赖关系没有没有声明用于编译测试的依赖项的地方。
testCompileOnly声明测试只编译依赖项声明仅在测试编译时需要的依赖项,但不应泄漏到运行时。这通常包括在运行时找到时被着色的依赖项。
testRuntimeOnly声明测试运行时依赖项没有没有声明仅在测试运行时需要的依赖项,而不是在测试编译时。

依赖之间的关系
在这里插入图片描述Test部分
在这里插入图片描述

绿色配置是用户用来声明依赖关系的配置
粉色的配置是组件编译或运行库时使用的配置
蓝色配置是组件内部的,供自己使用
在配置白色的配置从Java插件继承

常用的如下:

  • 1.compileOnly 编译时依赖
  • 2.runtimeOnly 运行时依赖
  • 3.api 可传递依赖
  • 4.implementation 非传递依赖
  • 5.testCompile 测试编译时依赖
  • 6.testRuntime 测试运行时依赖

注: compile, testCompile,runtime , testRuntime 已经被废弃,要尽量避免使用。

参考:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation

5.2 依赖配置项属性
  • 1.group属性指定依赖的分组(在Maven中,就是groupId)
  • 2.name属性指定依赖的名称(在Maven中,就是artifactId)
  • 3.version属性指定外部依赖的版本(在Maven中,就是version)
dependencies {
   implementation group: 'foo', name: 'foo', version: '0.1'
}
//也可以合并到一起去
dependencies {
   implementation 'foo:foo:0.1'
}
5.3 本地依赖

本地依赖:

dependencies {
       implementation files('libs/commons-lang.jar', 'libs/log4j.jar')
    }
5.4 排除依赖

排除依赖:

compile('com.example.m:m:1.0') {
   exclude group: 'org.unwanted', module: 'x
   }
5.5 中央仓库以外的文件依赖

添加来自 ant、libs 和 tools 目录的文件依赖:

configurations {
    antContrib 
    externalLibs
    deploymentTools
}

dependencies {
    antContrib files('ant/antcontrib.jar')
    externalLibs files('libs/commons-lang.jar', 'libs/log4j.jar')
    deploymentTools(fileTree('tools') { include '*.exe' })
}
5.6 项目间依赖

对于比较复杂的项目,会有模块(项目)间的依赖:

project(':student-service') {
    dependencies {
        implementation project(':utils')
        implementation project(':api')
    }
}

6 Gradle Wrapper

Gradle Wrapper是对Gradle 的包装,它的作用是简化Gradle本身的下载、安装和构建,比如它会在我们没有安装Gradle的情况下,去下载指定版本的Gradle并进行构建。
Gradle的版本很多,所以有可能出现版本兼容的问题,这时就需要Gradle Wrapper去统一Gradle的版本,避免开发团队因为Gradle版本不一致而产生问题。
步骤:

  • 1.解析参数传入 gradlew
  • 2.安装正确的 Gradle 版本
  • 3.调用 Gradle 执行命令

7 完整配置

我练习项目的Gradle完整配置:

plugins {
    id 'org.springframework.boot' version '2.1.5.RELEASE'
    id 'groovy'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.wxx.modules'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    maven {
        url 'http://repo1.maven.org/maven2'
    }
}


dependencies {
    //非传递依赖
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
    implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'

    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.boot:spring-boot-starter-reactor-netty'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-aop'

    implementation 'com.google.guava:guava:27.0.1-jre'
    implementation 'org.apache.commons:commons-lang3:3.8.1'
    implementation 'org.apache.commons:commons-text:1.6'
    implementation 'org.apache.cxf:cxf-rt-transports-http-hc:3.2.0'
    implementation 'org.apache.cxf:cxf-rt-frontend-jaxws:3.2.0'
    implementation 'com.sun.xml.bind:jaxb-core:2.2.11'
    implementation 'com.sun.xml.bind:jaxb-impl:2.2.11'

    implementation 'commons-lang:commons-lang:2.6'
    implementation 'commons-collections:commons-collections:3.2.2'
    implementation 'org.apache.commons:commons-collections4:4.3'
    implementation 'joda-time:joda-time:2.10.1'
    implementation 'com.graphql-java:java-dataloader:2.2.1'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1'
    implementation group: 'com.alibaba', name: 'druid', version: '1.1.17'
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'
    implementation group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '6.1.0.jre7'
    implementation group: 'capital.scalable', name: 'spring-auto-restdocs-json-doclet', version: '2.0.4'

    //测试时编译
    testCompile group: 'capital.scalable', name: 'spring-auto-restdocs-core', version: '2.0.4'

    //编译时依赖
    compileOnly 'org.projectlombok:lombok'

    //测试时依赖
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation "org.spockframework:spock-core:1.2-groovy-2.4"
    testImplementation 'org.mockito:mockito-core:2.24.5'
    testImplementation 'io.projectreactor:reactor-test:3.2.6.RELEASE'
}


参考资料:

[ 1 ].https://docs.gradle.org/current/userguide/userguide.html
[ 2 ].https://docs.gradle.org/current/userguide/declaring_dependencies.html
[ 3 ].https://gradle.org/guides/
[ 4 ].https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值