概述
gradle:项目构建工具
gradle 相关网址:
- 下载网址:https://gradle.org/releases/
- 官方文档:https://docs.gradle.org/current/userguide/userguide.html
- java 项目构建文档:https://docs.gradle.org/current/userguide/building_java_projects.html
- 官方文档中文翻译:https://www.ctolib.com/docs-GradleUserGuide-c-index.html
下载安装
1、下载:选择 binary-only 即可
- 浏览器直接下载或者命令行:curl -O https://downloads.gradle-dn.com/distributions/gradle-6.7.1-bin.zip
- 下载完后进行解压
2、gradle 配置:在 Windows 的当前用户的系统变量中设置相应的属性
- 新建 GRADLE_HOME 属性,值为 gradle 解压目录
- 在 path 属性中新增:%GRADLE_HOME%\bin
- 新增 GRADLE_USER_HOME 属性,值为 maven 仓库的地址,这样就可以让 gradle 使用 maven 仓库
gradle 安装测试:【Win + R】打开运行,输入 cmd ,回车,在 cmd 控制台上输入【gradle -v】
依赖管理
为 Java 项目指定依赖项需要以下三个信息:
- 需要哪个依赖项,例如名称和版本
- 用在什么地方,编译或运行
- 在哪些寻找
// build.gradle
repositories {
mavenLocal()
maven {
url "https://maven.aliyun.com/repository/public"
}
mavenCentral()
}
dependencies {
implementation 'org.hibernate:hibernate-core:3.6.7.Final'
}
三个元素的 gradle 术语:
- repositories:存储库,在哪里查找依赖项
- dependencies:需要导入的依赖项
- implementation:配置项
- 模块坐标:”group : module : version” 或 group,name,version
常见的配置项:
compile:被弃用,因为它不能区分影响 Java 库项目的公共 API 的依赖项和不影响 Java 库项目的公共 API 的依赖项
- compileOnly:用于编译生产代码所必需的依赖关系,但不应该属于运行时类路径
- implementation:取代 compile,用于编译和运行时
- runtimeOnly:取代 runtime,仅在运行时使用,不用于编译
- testCompileOnly:测试,相当于 compileOnly
- testImplementation:测试,相当于 implementation
- testRuntimeOnly:测试,相当于 runtimeOnly
编译代码
源代码集:主要思想是源文件和资源通常按类型进行逻辑分组,例如应用程序代码、单元测试和集成测试,每个逻辑组通常都有自己的文件依赖项集、类路径中,最重要的是,构成源集的文件不必位于同一目录中
源集能够将编译的几个方面联系在一起:
- 源文件及其位置
- 编译类路径,包括任何必须的依赖项
- 放置已经编译的类文件的位置
gradle 代码约定:
- src/main/java:生产源代码目录
- src/main/resources:正式配置文件目录
- src/test/java:单元测试代码目录
- src/test/resources:测试配置文件目录
- src/main/webapp:放置页面元素,如 js、css、img、jsp等
自定义文件和目录位置:
每个源集都定义其源代码所在的位置,以及类文件的资源和输出目录,可以通过以下语法进行覆盖
sourceSets {
main {
java {
srcDirs = ['src']
}
}
test {
java {
srcDirs = ['test']
}
}
}
如果不想覆盖预定,而是只想添加一个额外的源目录,则使用如下声明
sourceSets {
main {
java {
srcDir 'thirdParty/src/main/java'
}
}
}
gradle 常见约定:设置属性将替换值,而相应的方法会附加值
gradle 构建基础
gradle 的两个基本概念:projects(项目)、tasks(任务)
- 每一个构建都由一个或多个 projects 组成,一个 project 可以代表什么取决于你想利用 gradle 做什么,比如一个 project 可以代表一个要构建的某个东西,如一个 jar 或者一个要发布的 zip 压缩包;也可以代表一件准备要做的事,比如部署应用
- 每一个 project 由一或多个 task 组成,一个 task 代表一些更加精细化的构建
可以通过 gradle 命令运行一个 gradle 构建:
- gradle 命令会在当前目录查找一个叫 build.gradle 的文件(构建配置脚本)
java 插件
apply plugin: 'java'
- gradle tasks:列出项目的所有任务
- gradle build:创建一个包含类和资源的 JAR 文件
- gradle clean:删除 build 生成的目录和所有生成的文件
- gradle assemble:编译并打包代码(并不运行单元测试)
- gradle check:编译并测试你的代码
定制 MANIFEST.MF 文件:
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = '1.0'
jar {
manifest {
attributes "group":"name":"version"
}
使用 UTF-8 编码:
// UTF-8
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
buildscript、subprojects 和 allprojects
1、buildscript {} 块:用来加载 gradle 脚本自身需要使用的资源,可以声明的资源包括依赖项、第三方插件、maven 仓库地址等
- buildscript {} 块中的 repositories:为了 gradle 脚本自身的执行,获取脚本依赖插件
2、根级别的 repositories :用于为当前项目提供所需的依赖包,如 log4j 等依赖可以从 mavenCentral 获得
3、allprojects 块的 repositories 用于多项目构建,为所有项目(包括根项目)提供共同的所需依赖包,同时,子项目可以配置自己的 repositories 以获取自己独需的依赖包
4、subprojects 块的 repositories 用于配置这个项目的所有子项目,用于抽取子项目的相同配置,在需要时进行配置注入,避免重复配置。根项目就像一个容器, subprojects 方法遍历这个容器的所有元素并且注入指定的配置
allprojects 和 subprojects 的区别:
- allprojects:对所有项目的配置,包括 Root Project
- subprojects:对所有子项目的配置
gradle 的 plugins {} 和 apply plugin
gradle 官方插件库:https://plugins.gradle.org/
1、plugins {} 块这种方式引入的插件来自 Gradle 官方插件库,gradle 2.1版本以上可用
2、buildscript {} 块指定第三方库作为 gradle 插件,指定插件就需要使用 apply plugin
// plugins {}:使用官方的插件库
plugins {
id 'org.springframework.boot' version '2.2.2.RELEASE'
}
// 使用第三方库
buildscript {
// 指定仓库地址
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
// 指定依赖
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:2.2.2.RELEASE"
}
}
// 导入插件
apply plugin: "org.springframework.boot"
gradle 使用
多项目构建:
1、定义一个多项目构建工程需要在根目录创建一个 setting 配置文件来指明构建包含哪些项目,并且这个文件必须叫 settings.gradle:
include "shared","api"
2、公共配置:对多项目构建而言,总有一些共同的配置,在根项目上采用配置注入的发过誓定义一些公共配置;根项目就像一个容器,子项目会迭代访问它的配置并注入到自己的配置中
buildscript {
/**
* 指定所使用的仓库
* mavenLocal()从本地仓库导入
* maven() {url("https://maven.aliyun.com/repository/public")} 指定国内镜像,加快下载速度
* mavenCentral()表示使用中央仓库,此刻项目中所需要的jar包都会默认从中央仓库下载到本地指定目录
*/
repositories {
mavenLocal()
maven() {
url("https://maven.aliyun.com/repository/public")
}
mavenCentral()
}
// 定义变量
ext {
springBootVersion = '2.4.1'
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
}
}
subprojects {
group 'top.songfang'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.springframework.boot'
repositories {
mavenLocal()
maven() {
url("https://maven.aliyun.com/repository/public")
}
mavenCentral()
}
dependencies {
/**
* gradle工程的所有jar包的坐标都在dependencies属性内放置
* 每一个jar包的坐标都有三个基本元素组成
* group、name、version
* testCompile 表示该jar包在测试的时候起作用,该属性为jar包的作用域
* 在gradle里面添加坐标的时候都要带上jar包的作用域
*/
compile 'org.springframework.boot:spring-boot-starter-web'
annotationProcessor 'org.projectlombok:lombok:1.18.16'
compileOnly 'org.projectlombok:lombok:1.18.16'
}
}
dependency-management-plugin
官方文档:https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/
dependency-management-plugin:一个 gradle 插件,提供类似 Maven 的依赖项管理和排除
根据配置的依赖项管理元数据,“依赖项管理插件”将控制项目的直接和传递依赖项的版本,并将遵守项目依赖项的 poms 中声明的所有排除项。
插件要求:
- gradle 2.9以上
- java 6以上
获取:
1、从 gradle 官方插件库获取
plugins {
id "io.spring.dependency-management" version "1.0.10.RELEASE"
}
2、从 Maven Center 或 JCenter 仓库中获取
buildscript {
repositories {
// 国内建议使用镜像站
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://repo.spring.io/plugins-snapshot' }
}
dependencies {
classpath 'io.spring.gradle:dependency-management-plugin:1.0.7.BUILD-SNAPSHOT'
}
}
apply plugin: "io.spring.dependency-management"