升级 SpringBoot3 全项目讲解 — 为什么 SpringBoot3 应该抛弃 Maven,搭配 Gradle 来使用?

学会这款 🔥全新设计的 Java 脚手架 ,从此面试不再怕!

在这里插入图片描述
在这里插入图片描述
随着 Spring Boot 3 的发布,许多开发者开始考虑如何将现有项目升级到最新版本。Spring Boot 3 带来了许多新特性,包括对 Java 17 的支持、更好的性能优化以及对 GraalVM 的原生镜像支持。然而,在升级过程中,开发者们往往会忽略一个重要的环节:构建工具的选择。

长期以来,Maven 一直是 Java 生态系统中最为流行的构建工具之一。然而,随着 Gradle 的崛起,越来越多的项目开始转向 Gradle。本文将探讨为什么在升级到 Spring Boot 3 时,你应该考虑抛弃 Maven,转而使用 Gradle,并通过代码示例来展示 Gradle 的优势。

1. 为什么选择 Gradle?

1.1 构建速度更快

Gradle 采用了增量构建和缓存机制,这使得它在构建速度上比 Maven 更快。尤其是在大型项目中,Gradle 的优势更加明显。Spring Boot 3 项目通常包含大量的依赖和模块,使用 Gradle 可以显著减少构建时间。

1.2 灵活的构建脚本

Gradle 使用 Groovy 或 Kotlin DSL 作为构建脚本语言,这使得构建脚本更加灵活和强大。相比之下,Maven 的 XML 配置文件显得笨重且难以维护。通过 Gradle,你可以轻松地编写自定义任务、插件和扩展,以满足项目的特定需求。

1.3 更好的依赖管理

Gradle 的依赖管理机制比 Maven 更加灵活。它支持动态版本、依赖排除、依赖替换等高级功能。此外,Gradle 还支持复合构建(Composite Builds),这使得在多模块项目中管理依赖变得更加容易。

2. 从 Maven 迁移到 Gradle

2.1 创建 Gradle 构建脚本

首先,你需要在项目的根目录下创建一个 build.gradle 文件。以下是一个简单的 build.gradle 文件示例:

plugins {id 'org.springframework.boot' version '3.0.0'id 'io.spring.dependency-management' version '1.1.0'id 'java'
}group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'repositories {mavenCentral()
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'testImplementation 'org.springframework.boot:spring-boot-starter-test'
}test {useJUnitPlatform()
}

在这个示例中,我们使用了 Spring Boot 3 的 Gradle 插件,并指定了 Java 17 作为源代码兼容性版本。dependencies 块中定义了项目所需的依赖。

2.2 迁移 Maven 依赖

如果你已经有一个使用 Maven 构建的 Spring Boot 项目,你可以使用 Gradle 的 maven-publish 插件来自动迁移 Maven 依赖。以下是一个示例:

plugins {id 'maven-publish'
}publishing {publications {mavenJava(MavenPublication) {from components.java}}
}

通过这个插件,你可以将 Maven 项目中的依赖自动转换为 Gradle 的依赖格式。

2.3 多模块项目支持

在 Spring Boot 3 中,多模块项目非常常见。Gradle 对多模块项目的支持非常友好。以下是一个多模块项目的 settings.gradle 文件示例:

rootProject.name = 'my-spring-boot-project'include 'module1'
include 'module2'

在每个子模块中,你可以创建一个独立的 build.gradle 文件来定义模块特定的配置和依赖。

3. Gradle 的高级特性

3.1 自定义任务

Gradle 允许你轻松地定义自定义任务。以下是一个简单的自定义任务示例,用于打印项目的版本号:

task printVersion {doLast {println "Project version: ${project.version}"}
}

你可以通过运行 gradle printVersion 来执行这个任务。

3.2 使用 Kotlin DSL

如果你更喜欢 Kotlin,Gradle 也支持使用 Kotlin DSL 来编写构建脚本。以下是一个使用 Kotlin DSL 的 build.gradle.kts 文件示例:

plugins {id("org.springframework.boot") version "3.0.0"id("io.spring.dependency-management") version "1.1.0"java
}group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17repositories {mavenCentral()
}dependencies {implementation("org.springframework.boot:spring-boot-starter-web")testImplementation("org.springframework.boot:spring-boot-starter-test")
}tasks.test {useJUnitPlatform()
}

3.3 依赖锁定

Gradle 支持依赖锁定(Dependency Locking),这可以帮助你在多环境中保持依赖的一致性。以下是一个启用依赖锁定的示例:

dependencyLocking {lockAllConfigurations()
}

通过运行 gradle dependencies --write-locks,你可以生成依赖锁定文件。

4. 结论

在升级到 Spring Boot 3 的过程中,选择 Gradle 作为构建工具可以带来诸多优势。Gradle 不仅构建速度更快,而且提供了更加灵活和强大的构建脚本编写能力。通过本文的示例代码,你可以轻松地将现有项目从 Maven 迁移到 Gradle,并充分利用 Gradle 的高级特性来优化你的构建流程。

如果你还没有尝试过 Gradle,现在是时候考虑将它引入到你的 Spring Boot 3 项目中了。相信在不久的将来,Gradle 将成为 Java 生态系统中的主流构建工具。


希望这篇文章能够帮助你更好地理解为什么在升级到 Spring Boot 3 时应该选择 Gradle。如果你有任何问题或建议,欢迎在评论区留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习笔记(二十三)

1 CacheEvict CacheEvict是Spring框架中用于清空缓存的注解。以下是对CacheEvict注解的详细介绍: 1.1 作用 CacheEvict注解的主要作用是删除缓存中的数据。在方法执行后或执行前(根据配置),它可以清空指定的缓存项或整个缓存区…

如何优化Elasticsearch大文档查询?

记录一次业务复杂场景下DSL优化的过程 背景 B端商城业务有一个场景就是客户可见的产品列表是需要N多闸口及各种其它逻辑组合过滤的,各种闸口数据及产品数据都是存储在ES的(有的是独立索引,有的是作为产品属性存储在产品文档上)。 在实际使用的过程中&a…

openCvSharp 计算机视觉图片找茬

一、安装包 <PackageReference Include"OpenCvSharp4" Version"4.10.0.20241108" /> <PackageReference Include"OpenCvSharp4.runtime.win" Version"4.10.0.20241108" /> 二、准备两张图片 三、编写代码 using OpenCv…

实战:FRP内网穿透部署-支持ssh、web访问

目录 1 准备工作2 公网服务器部署server端2.1 frps.ini配置 3 内网客户端部署client端3.1 frpc.ini配置&#xff08;内网服务器01&#xff09;3.2 frpc.ini配置&#xff08;内网服务器02&#xff09; 4 服务启动脚本4.1 公网服务器 server4.2 内网服务器 client 2 systemctl常见…

Uniapp中实现加载更多、下拉刷新、返回顶部功能

一、加载更多&#xff1a; 在到达底部时&#xff0c;将新请求过来的数据追加到原来的数组即可&#xff1a; import {onReachBottom } from "dcloudio/uni-app";const pets ref([]); // 显示数据function network() {uni.request({url: "https://api.thecatap…

C# 多线程 Task TPL任务并行

先总结一下 之前发展过程的要点 1&#xff1a; 为了保证多线程正确顺序执行 线程同步 2&#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…

C++单例模式的设计

单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。在C中&#xff0c;单例模式通常用于管理全局资源或共享状态。 以下是C中实现单例模式的几种常见方式&#xff1a; 懒…

HBASE学习(一)

1.HBASE基础架构&#xff0c; 1.1 参考&#xff1a; HBase集群架构与读写优化&#xff1a;理解核心机制与性能提升-CSDN博客 1.2问题&#xff1a; 1.FLUSH对hbase的影响 2. HLog和memstore的区别 hlog中存储的是操作记录&#xff0c;比如写、删除。而memstor中存储的是写入…

Flutter:封装ActionSheet 操作菜单

演示效果图 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 标题/// [items] 选项列表 …

【Rust练习】28.use and pub

练习题来自&#xff1a;https://practice-zh.course.rs/crate-module/use-pub.html 1 使用 use 可以将两个同名类型引入到当前作用域中&#xff0c;但是别忘了 as 关键字. use std::fmt::Result; use std::io::Result;fn main() {}利用as可以将重名的内容取别名&#xff1a;…

Nginx 可观测性最佳实践

Nginx 介绍 Nginx 是一个开源、轻量级、高性能的 HTTP 和反向代理服务器&#xff0c;也可以用于 IMAP/POP3 代理服务器。Nginx 因其采用的异步非阻塞工作模型&#xff0c;使其具备高并发、低资源消耗的特性。高度模块化设计也使得 Nginx 具备很好的扩展性&#xff0c;在处理静…

《汽车维护与修理》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《汽车维护与修理》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《汽车维护与修理》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国汽车维修行业协会 …

PHP智慧小区物业管理小程序

&#x1f31f;智慧小区物业管理小程序&#xff1a;重塑社区生活&#xff0c;开启便捷高效新篇章 &#x1f31f; 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序&#xff0c;它犹如一股清新的科技之风&#xff0c;吹进了现代智慧小区的每一个角落…

洛谷P4868 Preprefix sum

洛谷传送门 题目描述 前缀和&#xff08;prefix sum&#xff09;&#x1d446;&#x1d456;。 前前缀和&#xff08;preprefix sum&#xff09;则把 &#x1d446;&#x1d456; 作为原序列再进行前缀和。记再次求得前缀和第 &#x1d456; 个是 &#x1d446;&#x1d446…

机器学习中的凸函数和梯度下降法

一、凸函数 在机器学习中&#xff0c;凸函数 和 凸优化 是优化问题中的重要概念&#xff0c;许多机器学习算法的目标是优化一个凸函数。这些概念的核心思想围绕着优化问题的简化和求解效率。下面从简单直观的角度来解释。 1. 什么是凸函数&#xff1f; 数学定义 一个函数 f…

vue3使用vue-native-websocket-vue3通讯

vue3使用vue-native-websocket-vue3通讯 插件使用一、启用Vuex集成1.在mian.js中2.store/index.js文件中3.要websocket使用的页面 二、启用Piain集成1.在mian.js中2.根目录下创建store文件夹&#xff0c;分别创建PiniaType.ts&#xff0c;store.ts&#xff0c;useSocketStore.t…

Windows图形界面(GUI)-QT-C/C++ - Qt控件与布局系统详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt布局系统(Layouts) 布局管理器基础 高级布局技巧 嵌套布局 设置间距和边距 常用控件详解 按钮类控件 QPushButton (标准按钮) QRadioButton (单选按钮) QCheckBox (复选框) …

深入理解 ECMAScript 2024 新特性:字符串 isWellFormed 方法

ECMAScript 2024 引入了一个新的字符串实例方法&#xff1a;String.prototype.isWellFormed。这一新增功能是为了帮助开发者更容易地验证字符串是否为有效的 Unicode 文本。本文将详细介绍这一方法的使用场景、实现原理及其在实际应用中的价值。 String.prototype.isWellFormed…

[Linux]Docker快速上手操作教程

前言 以下命令并不是docker的所有&#xff0c;仅涉及日常使用时最最常用的命令。 目的之一时给入门的朋友熟悉学习&#xff0c;其二时我自己偶尔使用时备忘。 一、概念 简单介绍下docker的相关概念&#xff1a; 镜像&#xff1a;Docker 镜像是一个轻量级、可执行的独立软件…

【算法学习笔记】32:筛法求解欧拉函数

上节学习的是求一个数 n n n的欧拉函数&#xff0c;因为用的试除法&#xff0c;所以时间复杂度是 O ( n ) O(\sqrt{n}) O(n ​)&#xff0c;如果要求 m m m个数的欧拉函数&#xff0c;那么就会花 O ( m n ) O(m \sqrt{n}) O(mn ​)的时间。如果是求连续一批数的欧拉函数&#x…