前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >换掉 Maven 和 Gradle:Maven 推出新一代构建工具,构建速度太快了,亲测好用!

换掉 Maven 和 Gradle:Maven 推出新一代构建工具,构建速度太快了,亲测好用!

作者头像
Java技术栈
发布2023-09-06 13:25:56
4850
发布2023-09-06 13:25:56
举报
文章被收录于专栏:Java技术栈Java技术栈

国内最强微服务框架,没有之一!

几乎覆盖 Spring Boot 所有操作!

2023 全新 Java 面试题(2500+)

maven-mvnd

基本介绍

当我们使用 Maven 构建项目时,通常需要启动 Maven 进行编译、测试和打包等操作,而 Maven 传统的构建太慢了,所以 Maven 新起了一个 maven-mvnd 项目,它的宗旨就是,借鉴来自 Gradle 和 Takari 中的技术以提供更快的 Maven 构建速度。

需要注意的是, maven-mvnd 并不能有独立于 Maven 使用,它只是对 Maven 的一种封装和改进,可以让 Maven 的构建操作更快、更高效。

开源地址如下:

https://github.com/apache/maven-mvnd/

mvnd 底层实现原因:

  • mvnd 内嵌了 Maven,安装 mvnd 后无需单独安装 Maven。
  • 应用会在一个长驻后台进程中构建,也就是守护进程。
  • 一个守护进程实例可以处理 mvnd 客户端的多次连续请求。
  • mvnd 客户端是一个使用了 GraalVM 构建的本机可执行文件,与启动传统 JVM 相比,它启动速度更快,占用的内存更少。
  • 如果没有空闲的守护进程,它可以并行生成多个守护进程处理构建请求。

mvnd 为什么快的原因:

  • 不需要每次构建重新启动 JVM,大大节省时间。
  • 持有 Maven 插件类的类加载器缓存在多个构建中,因此插件 jar 只被读取和解析一次。
  • 由 JVM 内部的即时 (JIT) 编译器生成的本机代码也被保留。与传统的 Maven 相比,JIT 编译花费的时间更少,在重复构建期间,JIT 优化代码立即可用。

默认情况下,mvnd 使用多个 CPU 内核并行构建模块,使用的核心数由以下公式给出:

Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)

下面是它在 24 核 CPU 机器上的构建图:

构建完成后,控制台会输出完整的 Maven 构建日志。

安装使用

各种系统的最新安装方式见上面的开源地址,那里有很详细的安装手册。

mvnd 和传统的 Maven 使用方式一样,前缀改用 mvnd 即可,后面的选项都是一样的,比如,安装完后,可以使用下面命令验证版本:

$ mvnd --version

可以看到安装的 mvnd 及 Maven 版本信息。

除了 Maven 基本选项, mvnd 还有一些附加选项,比如:

  • --status:查看当前所有的守护进程列表;
  • --stop:停止所有运行的守护进程;

更多的选项可以使用 mvnd --help 命令查看。

速度测试

栈长分别使用 mvn 及 mvnd 测试下我的 Spring Boot 实战开源学习项目:

https://github.com/javastacks/spring-boot-best-practice

这个开源学习项目有很多个模块,打包还挺费时的,来对比下两者的构建速度:

可以看到实测效果还是挺明显的,同样的机器同样的项目,使用传统的 mvn 需要 1 分多钟,而使用 mvnd 只要 20 多秒就完事了,这对于大工程来说还是挺能提升效率的。

另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。

Spring Boot 快速使用 Maven

Maven Wrapper

Spring Boot 也提供了使用 Maven 的相关快捷脚本,即 maven-mvnd 项目中提供的 Maven Wrapper 脚本,它可以免安装、快速使用 Maven、Gradle。

Spring 提供了一站式生成 Spring 应用的网站:

https://start.spring.io/

生成的 Demo 项目如下图所示:

除了常规的项目文件,还有两个特殊的脚本文件:

  • mvnw(Linux 版本)
  • mvnw.cmd(Windows 版本)

mvnw,全称为:Maven Wrapper,它其实就是来自 Maven 的 maven-mvnd 项目,使用 mvnw 可以快速将 Maven 集成到项目中。

栈长总结一下使用 mvnd 的场景:

  • 想省心,不想自己安装配置 Maven 环境;
  • 不同的应用,需要使用不同版本的 Maven;比如已有的 Maven 版本不合适,需要使用特定的 Maven 版本;

除了上面所说的 mvnw 脚本,在当前目录下会初始化一个 .mvn/wrapper 目录:

如果 Maven Wrapper 使用的并不是最新的版本,想使用最新的 Maven 3.8.5,可以在 maven-wrapper.properties配置文件中指定版本:

意味着你如果想用 mvnw,只要复制这些生成的文件到对应的项目目录就行了,然后想用哪个版本,改一改参数即可。

然后在 $USER_HOME/.m2/wrapper 目录中可以看到安装信息:

虽然不用自己另行安装,但本地仓库还是会自动下载对应版本的 Maven,只是省去了自己动手安装的流程。

使用方式

使用 Spring Initializr 网站一键生成的 Spring Boot 项目不需要单独安装 mvnw,生成后默认就带有 mvnw 系列文件,所以就不需要再另行安装 mvnw 了,直接使用即可。

比如,我们切到 demo 项目:

cd demo

运行项目清理安装命令:

./mvnw clean install

就像直接使用 mvn 命令一样,mvnw 只是包了一层而已,底层还是 mvn,所以,如果有多 Maven 版本管理这方面的需求,或者不想自己动手安装 Maven 的场景,这个 mvnw 脚本还是可以用来试试的,但实际工作中很少会使用到。

Gradle 也有类似的包装:

和 Maven 类似,这里就不再撰述了。

IDEA 中设置 mvnw

在 IDEA 中可以设置使用 Maven Wrapper:

如果要设置 Maven 版本信息,需要在当前应用有一个 .mvn 目录及参数定义文件,相关配置文件见 Spring 生成的 demo 项目,或者参考这里:

https://github.com/apache/maven-mvnd/tree/master/.mvn/wrapper

总结

mvnd 和 mvnw 它们两个都是 Maven 的包装工具,两者都是 Maven 的包装,不过 mvnd 是对 Maven 的包装和增强,而 mvnw 仅仅是一个 Maven 包装,两者的功能和作用场景不同。

使用 mvnd 可以比传统的 mvn 有更快的构建速度,它快的关键是它在后台保持一个运行的进程,而不需要每次构建都重新启动,还使用了启动速度更快、内存占用更少的 GraalVM 虚拟机构建。

mvnd 项目还提供了一键安装和运行脚本:mvnw,在 Spring Boot 中也能很轻易的使用,使用 mvnw 可以快速使用 Maven,不同的应用可以使用不同的 Maven 版本进行构建,本地无需手动安装多版本的 Maven。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本介绍
  • 安装使用
  • 速度测试
  • Spring Boot 快速使用 Maven
    • Maven Wrapper
      • 使用方式
        • IDEA 中设置 mvnw
        • 总结
        相关产品与服务
        云开发 CloudBase
        云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档