当前位置: 首页 > ds >正文

Gradle(二)Gradle的优势、项目结构介绍

目录

    • 一、什么是 Gradle?
    • 二、为什么选择 Gradle?
    • 三、Gradle 的项目结构
      • 3.1 项目结构
      • 3.2 gradle wrapper 包装器
      • 3.3 settings.gradle 设置文件
      • 3.4 build.gradle 核心构建文件
        • 1)原始文件内容
        • 2)plugins 插件
        • 3)repositories:仓库源
        • 4)dependencies 依赖

大家都知道 Gradle 和 Maven 一样,是一个项目的构建工具。它通过任务来控制开发的进程,这些任务包括:编译打包、测试、部署发布 等。Gradle 诞生于 2008 年,仅仅比 Maven 晚 4 年。Android 也采用 Gradle 作为默认的构建工具。

本文希望通过以下的讲述,帮助你快速轻松的使用 Gradle 加速您的 Spring Boot 开发应用。

一、什么是 Gradle?

Gradle 是一款基于 Apache Ant 和 Maven 概念的现代化构建工具,它结合了前两者的优点,同时引入了基于 Groovy(现也支持 Kitlin)的领域特定语言(DSL),使得构建脚本更加简洁灵活。


二、为什么选择 Gradle?

2012年开始,Spring 框架已全部使用 Gradle 来构建;2020年开始,Spring Boot 也全部采用 Gradle 来构建。官方使用 Gradle 的主要原因还是 “构建项目花费更少的时间”。(可参考:Spring/Spring Boot编译工具从Maven迁移到了Gradle)

但对于我们普通的应用开发来说,Gradle 对于我们的优势在于:更简洁的代码和更丰富的功能。(可参考:Gradle大战Maven,胜负已分?)

在这里插入图片描述

最近的一些统计报告,越来越显示出 Gradle 有越来越多的人在使用它。

  • stackoverflow 的趋势报告:
  • OpenLogic 发布的《2022年度开源报告》

Spring 官方生成应用程序的网站:spring initializer(https://start.spring.io/),也已将默认的构建工具从 Maven 切换到了 Gradle。

在这里插入图片描述

综合上述种种,小编觉得有必要了解一下快速易用的 Gradle 了。


三、Gradle 的项目结构

3.1 项目结构

打开 https://start.spring.io/,生成演示项目,项目的结构如下所示:

在这里插入图片描述

  • springboot-grade:Spring Boot 项目的根目录,基于 Gradle 构建。
  • grade/wrapper/:Gradle 包装器,是 Gradle 提供的一个轻量级脚本工具,用于在不预先安装 Gradle 的情况下运行 Gradle 构建任务。
    • grade-wrapper.jar:Gradle Wrapper 的可执行 JAR 文件。
    • grade-wrapper.properties:配置 Wrapper 使用的 Gradle 版本等信息。
  • src/:项目源代码目录(未展开具体内容)。
  • .gitignore - Git 忽略规则文件。
  • build.gradle - 项目构建脚本。
  • gradlew / gradlew.bat - Gradle Wrapper 启动脚本(Unix/Windows)。
  • settings.gradle - 定义项目模块和名称。

3.2 gradle wrapper 包装器

Gradle Wrapper 是 Gradle 包装器,是 Gradle 提供的一个轻量级脚本工具,用于 在不预先安装 Gradle 的情况下运行 Gradle 构建任务。它允许开发者同一项目的构建环境,避免因本地 Gradle 版本不同导致的构建问题。

可以直接通过 gradle wrapper 脚本对程序进行编译、打包、测试、部署和发布等任务操作。

  • gradlew:是针对 List/MacOS 的 gradle wrapper;
  • gradlew.bat:是针对 Windows 的 gradle wrapper。

补充:如何加速 gradle wrapper 的下载速度?

gradle wrapper 会自动下载 gradle,若默认的下载 gradle 的 url 网速很慢,可以替换成阿里云或腾讯云的地址。当然可以是你公司内部的文件下载地址。

我们在 gradle/wrapper/gradle-wrapper.propertiesdistributionUrl 类配置:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

若使用阿里云的地址加速(列表页面:https://mirrors.aliyun.com/macports/distfiles/gradle/),配置如下:

distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-7.5.1-bin.zip

若使用腾讯云的地址加速(列表页面:https://mirrors.cloud.tencent.com/gradle/),配置如下:

distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zip

3.3 settings.gradle 设置文件

本文件配置构建项目所需要的信息,Spring Boot 项目的该文件内容很简单:

rootProject.name = 'gradle-demo'

此项是为了配置编译之后文件的名字。

3.4 build.gradle 核心构建文件

1)原始文件内容

生成的 build.gradle 的文件内容如下:

plugins {id 'org.springframework.boot' version '2.7.5'id 'io.spring.dependency-management' version '1.0.15.RELEASE'id 'java'
}group = 'top.wisely'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'configurations {compileOnly {extendsFrom annotationProcessor}
}repositories {maven { url 'https://maven.aliyun.com/repository/public/' }maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }mavenCentral()
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'testImplementation 'org.springframework.boot:spring-boot-starter-test'
}tasks.named('test') {useJUnitPlatform()
}
2)plugins 插件
  • plugins {...}:插件部分,声明了 plugins 的依赖。核心插件只需要使用 id 简称即可,社区插件需要使用全名称的 id。
    • id 'org.springframework.boot' version '2.7.5':社区插件,Spring Boot Gradle 插件,它为我们提供 Spring Boot 运行、创建可执行 jar 包或者 war 包的能力。
    • id 'io.spring.dependency-management' version '1.0.15.RELEASE':社区插件,Spring Boot 依赖管理插件,它为我们提供对项目直接或间接依赖的库的版本控制,这些都是 Spring Boot 做过兼容性测试的版本。
    • id 'java':核心插件:Java 插件将 Java 编译以及测试等功能添加到项目中。
3)repositories:仓库源
  • repositories {...}:仓库源,配置了下载依赖包的地址。
    • mavenCentral():Gradle 默认使用 Maven 的中心库下载依赖包。
    • maven { url 'https://maven.aliyun.com/repository/public/' }:也可以通过阿里云的 Maven 镜像库来加速。
    • maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }:或者通过腾讯云的 Maven 镜像库来加速。
4)dependencies 依赖
  • dependencies {...}:依赖信息。

    • implementation:普通依赖。

      我们只需要按照下面的格式即可引入依赖:

      implementation group: '***', name: '***', version: '***'
      

      或简写成:

      implementation 'group:name:version'
      

      因为使用了 Spring Boot 依赖管理插件,只要被 Spring Boot 所管理的依赖,版本无须维护,可以更加精简地写成:

      implementation 'group:name'
      

      所以 Spring Boot 所管理的依赖样子一般为:

      dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'// ...
      }
      

在我们绝大部分时间,我们和 Gradle 做依赖相关的工作,在了解这些后都能解决了。

我们可以通过 https://mvnrepository.com/ 网站查找添加依赖,我们在依赖中选中 Gralde 来复制内容到我们的依赖中:

在这里插入图片描述

注意,一般情况下,我们会把复制来的版本号给去掉,以防 Spring Boot 已经对它做了版本管理,这样我们就能直接下载兼容性良好的依赖包;如果去掉版本号后不能下载依赖包,意味着 Spring Boot 没有做该包的版本管理,这是我们按照自己的需要添加合适的版本号。

  • testImplementation:测试依赖
    • testImplementation 'org.springframework.boot:spring-boot-starter-test':测试相关的依赖,使用 testImplementation,规则和普通依赖一致。
  • compileOnly:编译依赖
    • compileOnly 'org.projectlombok:lombok':只在编译期生效的依赖。
  • runtimeOnly:运行时依赖
    • runtimeOnly 'com.mysql:mysql-connector-j':旨在运行时起效的依赖。

由上述比较,我们发现Gradle有明显于Maven的优势。我提出下面的建议:

1、新项目尝试使用Gradle来构建!

2、尝试迁移Maven的老项目将其使用Gradle构建。(如:Spring/Spring Boot编译工具从Maven迁移到了Gradle「官网翻译」)

不愿迁移的理由很多:

1、对于Maven很熟悉了,不用迁移到新的工具!

2、又要学习一个新东西,卷不动了!

我觉得无论作为什么样的职业,对新的东西要保持敏锐的感知和学习,不要停留在自己舒适的区域,无论Gradle有没有那么优秀,或者有没有那么多问题,我们要坚持尝试一下。

最后送给大家一句话:

“I can’t understand why people are frightened of new ideas. I’m frightened of the old ones.” — John Cage
“我不明白为什么人们害怕新想法。 我害怕那些旧的。” - 约翰凯奇。

勇敢迈出舒适区,去冒险吧!

整理完毕,完结撒花~ 🌻





参考地址:

1.使用Gradle全面加速Spring Boot开发,https://zhuanlan.zhihu.com/p/578972804

http://www.xdnf.cn/news/17856.html

相关文章:

  • LINUX812 shell脚本:if else,for 判断素数,创建用户
  • Spring Boot项目中调用第三方接口
  • B站 韩顺平 笔记 (Day 16)
  • 终端安全与网络威胁防护笔记
  • 秋招笔记-8.12
  • Web 安全之互联网暴露面管理
  • 计算机网络2-3:传输方式
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记:UART Controller,通用异步收发传输器控制器
  • C语言中关于普通变量和指针变量、结构体包含子结构体或包含结构体指针的一些思考
  • windows单机单卡+CIFAR-10数据集+Docker模拟训练
  • 一键设置 NTP 时区的脚本(亲测,适用于部署 K8S 的前置环境)
  • http网页部署
  • 【从零开始java学习|第四篇】IntelliJ IDEA 入门指南
  • C++方向知识汇总(四)
  • Ansible 自动化介绍
  • 如何在idea中导入外来文件
  • 基于大数据的在线教育评估系统 Python+Django+Vue.js
  • C++中template、 implicit 、explicit关键字详解
  • Rust 项目编译故障排查:从 ‘onnxruntime‘ 链接失败到 ‘#![feature]‘ 工具链不兼容错误
  • Rust:构造函数 new() 如何进行错误处理?
  • Xshell远程连接Ubuntu 24.04.2 LTS虚拟机
  • HCIP项目之OSPF综合实验
  • [Robotics_py] 路径规划算法 | 启发式函数 | A*算法
  • Linux系统编程Day13 -- 程序地址空间
  • git config的配置全局或局部仓库的参数: local, global, system
  • MaxKB+合合信息TextIn:通过API实现PDF扫描件的文档审核
  • 如何构建PHP表单页面及验证相关原理(PHP基础)
  • 自动驾驶决策算法 —— 有限状态机 FSM
  • Android 引导式访问(屏幕固定 Screen Pinning)完整指南
  • Fluent Bit 日志合并正则表达式(上)