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

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.dtcms.com/a/327344.html

相关文章:

  • 电商双11美妆数据分析(一)
  • Honeywell霍尼韦尔A205压力传感器HC41H106P060169419G固瑞克117764美国制造
  • Rust 项目编译故障排查:从 ‘onnxruntime‘ 链接失败到 ‘#![feature]‘ 工具链不兼容错误
  • KAQG:一种用于生成难度可控问题的知识图谱的增强的RAG系统(论文大白话)
  • 2025AI行业升级生态战:谁在“种树”?谁在“造林”?
  • 02-Ansible 基本使用
  • Visual Studio中VC++目录、C/C++和链接器配置的区别与最佳实践
  • Minst手写数字识别
  • python2操作neo4j
  • 非凸科技受邀参加Community Over Code Asia 2025 Rust分论坛
  • 上海AI实验室发布MinerU2:通专融合路线如何补齐AI-Ready数据的最后一公里
  • AutoAgent节点入门:解锁智能体的自主规划能力
  • Myqsl建立库表练习
  • 盲盒抽谷机小程序系统开发:解锁盲盒新玩法,开启潮玩社交新时代
  • 论答题pk小程序软件版权的
  • DeepSeek-R1与RAGflow本地部署全流程指南:从模型下载到个人知识库构建实战
  • 真实案例 | 如何用iFlyCode开发Webpack插件?
  • string 类运算符重载
  • LeetCode Day5 -- 栈、队列、堆
  • JavaScript 实现模块懒加载的几种方式
  • 如何轻松解除Facebook封锁
  • flinksql bug: Received resultset tuples, but no field str
  • 阿里云国际DDoS高防:添加网站配置指南
  • 腾讯codebuddy.ai 安装实测【从零开始开发在线五子棋游戏:完整开发记录】
  • 机械学习--TF-IDF实战--红楼梦数据处理
  • wordpress数据库导入时的#1044错误
  • Linux中使用计划任务和tar命令实现文件备份
  • 【Unity】Spine重新播放动画时会闪烁上次动画的残影
  • K8S 节点初始化一键脚本(禁用 SELinux + 关闭 swap + 开启 ipvs 亲测实用)
  • SQL 与 NoSQL 的核心区别