首页 Gradle入门
文章
取消

Gradle入门

Gradle入门1

1 Gradle 简介

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

image-20230427112729556

2 常见的项目构建工具

  1. Ant:

    2000 年 Apache 推出的纯 Java 编写构建工具,通过 xml[build.xml]文件管理项目

    • 优点:使用灵活,速度快(快于 gradle 和 maven),
    • 缺点:Ant 没有强加任何编码约定的项目目录结构,开发人员需编写繁杂 XML 文件构建指令,对开发人员是一个挑战。
  2. Maven:

    2004 年 Apache 组织推出的再次使用 xml 文件[pom.xml]管理项目的构建工具。

    • 优点: 遵循一套约定大于配置的项目目录结构,使用统一的 GAV 坐标进行依赖管理,侧重于包管理。
    • 缺点:项目构建过程僵化,配置文件编写不够灵活、不方便自定义组件,构建速度慢于 gradle。
  3. Gradle:

    2012 年 Google 推出的基于 Groovy 语言的全新项目构建工具,集合了 Ant 和 Maven 各自的优势。

    • 优点:集 Ant 脚本的灵活性+Maven 约定大于配置的项目目录优势,支持多种远程仓库和插件,侧重于大项目构建。
    • 缺点:学习成本高、资料少、脚本灵活、版本兼容性差等。

对比:

自动化构建工具对比AntMavenGradle
构建性能最高最低居中
仓库开发者自己处理maven仓库支持多种远程仓库
依赖管理ivy管理GAV坐标管理GNV坐标管理
插件支持实现方便实现较难实现方便
遵循特定目录结构No遵循同maven
配置文件xml文件最为繁琐xml文件代码脚本,便于写业务逻辑
侧重点小型项目构建项目包管理大型项目构建
目前地位使用较少目前主流未来趋势(spring家族)

3 Gradle 安装

3.1. Gradle 安装说明

  1. SpringBoot 与 Gradle 存在版本兼容问题,
  2. Gradle 与 Idea 也存在兼容问题
  3. SpringBoot 官方文档明确指出,目前 SpringBoot 的 Gradle 插件需要 gradle6.8 版本及以上。

参考文档

1. Introduction

The Spring Boot Gradle Plugin provides Spring Boot support in Gradle. It allows you to package executable jar or war archives, run Spring Boot applications, and use the dependency management provided by spring-boot-dependencies. Spring Boot’s Gradle plugin requires Gradle 6.8, 6.9, or 7.x and can be used with Gradle’s configuration cache.

3.2. 安装 JDK

要求 Jdk 为 1.8 或者 1.8 版本以上。

3.3. 下载并解压到指定目录

  1. 下载

    image-20230427113933396

  2. 解压:D:\software\gradle-7.4.1

3.4. 系统环境变量配置

  1. GRADLE_HOME:D:\software\gradle-7.4.1

  2. GRALE_USER_HOME :D:\repos\mavenrepos3.5.4

    相当于配置 Gradle 本地仓库位置和 Gradle Wrapper 缓存目录

image-20230427114659327

3.5. 检测是否安装成功

gradle -v 或者 gradle --version

image-20230427114915007

4 Gradle 项目目录结构

Gradle 项目默认目录结构和 Maven 项目的目录结构一致,都是基于约定大于配置Convention Over Configuration】。

Tips:tipping_hand_man::

  1. 只有war工程才有webapp目录,对于普通的jar工程并没有webapp目录
  2. gradlew与gradlew.bat执行的指定wrapper版本中的gradle指令,不是本地安装的gradle指令。

image-20230427115021267

5 Gradle 创建第一个项目

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

image-20230427115446796

5.1. Gradle 中的常用指令

gradle 的指令要在含有 build.gradle 的目录执行。

常用gradle指令作用
gradle clean清空build目录
gradle classes编译业务代码和配置文件
gradle test编译测试代码,生成测试报告
gradle build构建项目
gradle build -x test跳过测试构建构建

5.2. 修改 maven 下载源

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

5.2.1. init.d文件夹

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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/' }
           }
        }
    }
    
  2. 启用 init.gradle 文件的方法 :

    1. 在命令行指定文件

      gradle --init-script yourdir/init.gradle -q taskName

      你可以多次输入此命令来指定多个init文件

    2. 把init.gradle文件放到 USER_HOME/.gradle/ 目录下

    3. 把以.gradle结尾的文件放到 USER_HOME/.gradle/init.d/ 目录下

    4. 把以.gradle结尾的文件放到 GRADLE_HOME/init.d/ 目录下

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

  3. 仓库地址说明

    • 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访问,在新版本中已经废弃jcenter(),替换为了mavenCentral()

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

  4. 阿里云云效 Maven

仓库名称阿里云仓库地址阿里云仓库地址(老版)源地址
centralhttps://maven.aliyun.com/repository/centralhttps://maven.aliyun.com/nexus/content/repositories/centralhttps://repo1.maven.org/maven2/
jcenterhttps://maven.aliyun.com/repository/publichttps://maven.aliyun.com/nexus/content/repositories/jcenterhttp://jcenter.bintray.com/
publichttps://maven.aliyun.com/repository/publichttps://maven.aliyun.com/nexus/content/groups/publiccentral仓和jcenter仓的聚合仓
googlehttps://maven.aliyun.com/repository/googlehttps://maven.aliyun.com/nexus/content/repositories/googlehttps://maven.google.com/
gradle-pluginhttps://maven.aliyun.com/repository/gradle-pluginhttps://maven.aliyun.com/nexus/content/repositories/gradle-pluginhttps://plugins.gradle.org/m2/
springhttps://maven.aliyun.com/repository/springhttps://maven.aliyun.com/nexus/content/repositories/springhttp://repo.spring.io/libs-milestone/
spring-pluginhttps://maven.aliyun.com/repository/spring-pluginhttps://maven.aliyun.com/nexus/content/repositories/spring-pluginhttp://repo.spring.io/plugins-release/
grails-corehttps://maven.aliyun.com/repository/grails-corehttps://maven.aliyun.com/nexus/content/repositories/grails-corehttps://repo.grails.org/grails/core
apache snapshotshttps://maven.aliyun.com/repository/apache-snapshotshttps://maven.aliyun.com/nexus/content/repositories/apache-snapshotshttps://repository.apache.org/snapshots/

5.3. Wrapper 包装器

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

5.3.1. 如何使用 Gradle Wrapper

项目中的gradlewgradlew.cmd脚本用的就是wrapper中规定的gradle版本。

而我们上面提到的gradle指令用的是本地gradle,所以gradle指令和gradlew指令所使用的gradle版本有可能是不一样的。gradlew、gradlew.cmd的使用方式与gradle使用方式完全一致,只不过把gradle指令换成了gradlew指令。

5.3.2. gradlew 指令

参数名说明
–gradle-version用于指定使用的Gradle版本
–gradle-distribution-url用于指定下载Gradle发行版的url地址

示例:

1
2
gradle wrapper --gradle-version=4.4	# 升级wrapper版本号,只是修改gradle.properties中wrapper版本,未实际下载
gradle wrapper --gradle-version 5.2.1 --distribution-type all # 关联源码用

5.3.3. GradleWrapper 的执行流程

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

image-20230427142442683

5.3.4. gradle-wrapper.properties 文件解读

字段名说明
distributionBase下载的Gradle压缩包解压后存储的主目录
distributionPath相对于distributionBase的解压后的Gradle压缩包的路径
zipStoreBase同distributionBase,只不过是存放zip压缩包的
zipStorePath同distributionPath,只不过是存放zip压缩包的
distributionUrlGradle发行版压缩包的下载地址

注意:

  • GRALE_USER_HOME 环境变量用于这里的 Gradle Wrapper 下载的特定版本的 gradle 存储目录。如 果我们没有配置过 GRALE_USER_HOME 环境变量,默认在当前用户家目录下的.gradle 文件夹中

  • 下载别人的项目或者使用操作以前自己写的不同版本的gradle项目时:用Gradle wrapper,也即:gradlew

    新建一个项目时: 使用gradle指令

本文由作者按照 CC BY 4.0 进行授权

Spring源码 概述

Gradle 与 Idea 整合