Gradle 简介

Gradle 是一款 Google 推出的基于 JVM、通用灵活的项目构建工具,支持 Maven,JCenter 多种第三方仓库;支持传递性 依赖管理、废弃了繁杂的 xml 文件,转而使用简洁的、支持多种语言(例如: java、groovy 等)的 build 脚本文件。

官网地址 : https://gradle.org/

常见的构建工具

Ant: 2000 年 Apache 推出的纯 Java 编写构建工具,通过 xml[build.xml]文件管理项目 优点:使用灵活,速度快(快于 gradle 和 maven), 缺点:Ant 没有强加任何编码约定的项目目录结构,开发人员需编写繁杂 XML 文件构建指令,对开发人员是一个挑战。

Maven: 2004 年 Apache 组织推出的再次使用 xml 文件[pom.xml]管理项目的构建工具。 优点: 遵循一套约定大于配置的项目目录结构,使用统一的 GAV 坐标进行依赖管理,侧重于包管理。 缺点:项目构建过程僵化,配置文件编写不够灵活、不方便自定义组件,构建速度慢于 gradle。

Gradle: 2012 年 Google 推出的基于 Groovy 语言的全新项目构建工具,集合了 Ant 和 Maven 各自的优势。 优点:集 Ant 脚本的灵活性+Maven 约定大于配置的项目目录优势,支持多种远程仓库和插件,侧重于大项目构建。 缺点:学习成本高、资料少、脚本灵活、版本兼容性差等。

Gradle 安装

Gradle 和 Java版本对应关系

Java versionFirst Gradle version to support it82.094.3104.7115.0125.4136.0146.3156.7167.0177.3187.5197.6

Mac 安装(使用Homebrew安装)

安装gradle

# 安装

brew install gradle

查看安装的版本号(检测是否安装成功)

gradle --version

查看安装的目录

brew list gradle

配置环境变量

查看当前(shell)

~/.bash_profile 是 Bash Shell 的配置文件,而 ~/.zshrc 是 Zsh Shell 的配置文件。这些文件用于配置各自的环境变量、别名、函数和其他 Shell 相关的设置。

~/.bash_profile:Bash Shell 在登录时会加载该文件。它适用于 macOS 默认的终端应用程序 Terminal,默认使用的是 Bash Shell。 ~/.zshrc:Zsh Shell 在启动时会加载该文件。Zsh 是一种功能强大且高度可定制的 Shell,可以替代默认的 Bash Shell。在最新版本的 macOS(如 macOS Catalina 和 Big Sur)中,默认终端应用程序已经切换到使用 Zsh Shell。

如果正在使用默认的终端应用程序,并且没有手动更改 Shell,那么 ~/.bash_profile 文件将会被加载。但是,如果已切换为 Zsh Shell,那么应该编辑 ~/.zshrc 文件来配置环境变量和其他 Shell 相关设置。

根据当前使用的 Shell 来选择相应的配置文件进行编辑,以便设置 GRADLE_HOME 环境变量或其他需要的配置。

echo $SHELL

# 在终端中运行此命令后,会显示所使用的 shell 的路径。例如,如果输出是 `/bin/bash`,则表示当前使用的是 Bash Shell;如果输出是 `/bin/zsh`,则表示当前使用的是 Zsh Shell

bash shell 则使用配置文件: ~/.bash_profile

Zsh Shell 则使用配置文件: ~/.zshrc

# 添加 gradle本地仓库地址

export GRADLE_USER_HOME=/Users/mi/development/maven/repository

# gradle 安装地址(终端执行 gradle --version 有输出的话,就不需要配置)

# export GRADLE_HOME=/opt/homebrew/Cellar/gradle/8.2.1

重新加载配置文件

#

# bash shell 则使用: source ~/.bash_profile

# Zsh Shell 则使用: source ~/.zshrc

Gradle 项目目录结构

Gradle 项目默认目录结构和 Maven 项目的目录结构一致,都是基于约定大于配【Convention Over Configuration】。 其完整项目目录结构如下所示:

创建Gradle 项目

借助于 spring 脚手架创建 gradle 第一个项目:https://start.spring.io/

生成的目录结构如下所示

修改 maven 下载源

Gradle 自带的 Maven 源地址是国外的,该 Maven 源在国内的访问速度是很慢的,除非使用了特别的手段。一般情况下, 建议使用国内的第三方开放的 Maven 源或企业内部自建 Maven 源。

我们可以在 gradle 的 init.d 目录下创建以.gradle 结尾的文件,.gradle 文件可以实现在 build 开始之前执行,所以你可以在这个文件配置一些你想预先加载的操作

在 init.d 文件夹创建 init.gradle 文件

allprojects {

repositories {

mavenLocal()

maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }

maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }

mavenCentral()

}

buildscript {

repositories {

maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }

maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' }

maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }

}

}

}

拓展 1:启用 init.gradle 文件的方法有:

在命令行指定文件,例如:gradle --init-script yourdir/init.gradle -q taskName。你可以多次输入此命令来指定多个init文件把init.gradle文件放到 USER_HOME/.gradle/ 目录下把以.gradle结尾的文件放到 USER_HOME/.gradle/init.d/ 目录下把以.gradle结尾的文件放到 GRADLE_HOME/init.d/ 目录

如果存在上面的4种方式的2种以上,gradle会按上面的1-4序号依次执行这些文件,如果给定目录下存在多个init脚本,会按拼音a-z顺序执行这些脚本,每个init脚本都存在一个对应的gradle实例,你在这个文件中调用的所有方法和属性,都会委托给这个gradle实例,每个init脚本都实现了Script接口。

拓展 2:仓库地址说明

mavenLocal(): 指定使用maven本地仓库,而本地仓库在配置maven时settings文件指定的仓库位置。如E:/repository,gradle查找jar包顺序如下:USER_HOME/.m2/settings.xml >> M2_HOME/conf/settings.xml >> USER_HOME/.m2/repository

maven { url 地址},指定maven仓库,一般用私有仓库地址或其它的第三方库【比如阿里镜像仓库地址】。 mavenCentral():这是Maven的中央仓库,无需配置,直接声明就可以使用。 jcenter():JCenter中央仓库,实际也是是用的maven搭建的,但相比Maven仓库更友好,通过CDN分发,并且支持https访问,在新版本中已经废弃了,替换为了mavenCentral()。

总之, gradle可以通过指定仓库地址为本地maven仓库地址和远程仓库地址相结合的方式,避免每次都会去远程仓库下载依赖库。这种方式也有一定的问题,如果本地maven仓库有这个依赖,就会从直接加载本地依赖,如果本地仓库没有该依赖,那么还是会从远程下载。但是下载的jar不是存储在本地maven仓库中,而是放在自己的缓存目录中,默认在 USER_HOME/.gradle/caches目录,当然如果我们配置过GRADLE_USER_HOME环境变量,则会放在GRADLE_USER_HOME/caches目录,那么可不可以将gradle caches指向maven repository。这是不行的,caches下载文件不是按照maven仓库中存放的方式。

拓展 3:阿里云仓库地址请参考:https://developer.aliyun.com/mvn/guide

Wrapper 包装器

Gradle Wrapper 实际上就是对 Gradle 的一层包装,用于解决实际开发中可能会遇到的不同的项目需要不同版本的 Gradle

问题。例如:把自己的代码共享给其他人使用,可能出现如下情况: 1.对方电脑没有安装 gradle 2.对方电脑安装过 gradle,但是版本太旧了

这时候,我们就可以考虑使用 Gradle Wrapper 了。这也是官方建议使用 Gradle Wrapper 的原因。实际上有了 GradleWrapper 之后,我们本地是可以不配置 Gradle 的,下载 Gradle 项目后,使用 gradle 项目自带的 wrapper 操作也是可以的。

那如何使用 Gradle Wrapper 呢?

项目中的gradlew、gradlew.cmd脚本用的就是wrapper中规定的gradle版本。参见源码 而我们上面提到的gradle指令用的是本地gradle,所以gradle指令和gradlew指令所使用的gradle版本有可能是不一样的。 gradlew、gradlew.cmd的使用方式与gradle使用方式完全一致,只不过把gradle指令换成了gradlew指令。 也可以在终端执行 gradlew 指令时,指定指定一些参数,来控制 Wrapper 的生成,比如依赖的版本等,如下:

具体操作如下所示 :

gradle wrapper --gradle-version=4.4:升级wrapper版本号,只是修改gradle.properties中wrapper版本,未实际下载

gradle wrapper --gradle-version 5.2.1 --distribution-type all :关联源码用

GradleWrapper 的执行流程:

当我们第一次执行 ./gradlew build 命令的时候,gradlew 会读取 gradle-wrapper.properties 文件的配置信息准确的将指定版本的 gradle 下载并解压到指定的位置(GRADLE_USER_HOME目录下的wrapper/dists目录中)并构建本地缓存(GRADLE_USER_HOME目录下的caches目录中),下载再使用相同版本的gradle就不用下载了之后执行的 ./gradlew 所有命令都是使用指定的 gradle 版本。如下图所示:

gradle-wrapper.properties 文件解读

在这里插入代码片

注意:

前面提到的 GRALE_USER_HOME 环境变量用于这里的 Gradle Wrapper 下载的特定版本的 gradle 存储目录。如果我们没有配置过 GRALE_USER_HOME 环境变量,默认在当前用户家目录下的.gradle 文件夹中。 那什么时候选择使用 gradle wrapper、什么时候选择使用本地 gradle? 下载别人的项目或者使用操作以前自己写的不同版本的gradle项目时:用Gradle wrapper,也即:gradlew什么时候使用本地gradle? 新建一个项目时: 使用gradle指令即可。

精彩内容

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。