更快的Maven构建工具mvnd和Gradle哪个性能更好?

faf36e94161e2ae783eae1b72cb8cb71.png

作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

Maven 作为经典的项目构建工具相信很多人已经用很久了,但如果体验过 Gradle,那感觉只有两个字“真香”。前段时间测评了更快的 Maven 构建工具 mvnd,感觉性能挺高的,貌似有了种“没必要再用 Gradle”的感觉了,而本文通过三者的性能对比,告诉你到底谁才是王者。

1.mvnd 简介

mvnd 是 Maven Daemon 的缩写 ,翻译成中文就是 Maven 守护进程。mvnd 是 apache/maven 的一个子项目,它并不是一个全新的构建工具,而是对 maven 的扩展。它内置了 maven,其实现原理是构建了一个或者多个 maven 守护进程来执行构建服务。

2.Gradle 简介

Gradle 是新一代开源的自动化构建工具,具有高效和灵活等诸多优势,广泛用于 Java 系的开发流中。

Gradle 优点简述

  • 语法体验更好,可以摆脱 XML 这种繁琐的配置。

  • Gradle 构建速度很快,它可以通过重用先前执行的输出,仅处理已更改的输入且通过并行执行任务来快速完成构建。

  • 可以在脚本里面直接写逻辑,灵活度体验比 Maven 高。

  • Gradle 是 Android 的官方构建工具,并支持许多流行的语言和技术。

  • 可以直接原生兼容 Maven 的配置,反过来的话 Maven 做不到原生兼容 Gradle。

  • Gradle 版本更新速度很快。

3.Gradle 使用

使用 Idea 我们可以直接创建 Gradle 项目,以 Spring Boot 项目的创建为例,如下图所示:e22451caa869d270f1135555a1472007.png选择第 3 个 Gradle Project 项目即可。

Gradle 和 Maven 一样,无需安装,只需要使用 Idea 提供的默认插件就行。

3.1 更换 Gradle 为国内源

为了更快的下载(第三方 jar 包)我们可以配置一下 Gradle 为国内源,首先打开用户目录下的 .gradle 文件夹,创建一个 init.gradle 文件,如下图所示:edfafe86c3ca9b7db16ccbb4edd82980.png添加如下配置:

allprojects {repositories {maven {url 'https://maven.aliyun.com/repository/public/'}mavenLocal()mavenCentral()}
}

以上是设置下载数据源为阿里云。

注意:设置国内源要在创建项目之前,这样在创建 Spring Boot 项目时就可以直接使用国内数据源了,这样才能加速项目的创建和初始化。

设置了国内源之后,开始创建 Gradle 版本的 Spring Boot 项目,和 Maven 的创建方式类似,这里就不再赘述了,最终创建好的 Spring Boot 项目如下:431c79b59b4f1dd190996753af8eaac6.png可以看出 Gradle 项目的目录和 Maven 项目的目录几乎是一致的,以下是 Maven 项目的目录:034039a8b136abe4a32ea693dcf946c8.png

3.2 项目依赖文件对比

Maven 项目的依赖配置文件是 pom.xml,而 Gradle 项目的依赖文件是 settings.gradle 和 build.gradle。

settings.gradle  VS build.gradle

settings.gradle 文件是 gradle 项目的总体配置文件,一般会把子项目中通用的一些配置放在这个文件中,有点类似于 maven 的 parent pom 文件,而 build.gradle 文件则是针对单个项目的具体配置,我们主要使用的是 build.gradle 文件。build.gradle 配置内容如下:

plugins {id 'org.springframework.boot' version '2.5.8'id 'io.spring.dependency-management' version '1.0.11.RELEASE'id 'java'
}group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'configurations {compileOnly {extendsFrom annotationProcessor}
}repositories {mavenCentral()
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'compileOnly 'org.projectlombok:lombok'developmentOnly 'org.springframework.boot:spring-boot-devtools'annotationProcessor 'org.projectlombok:lombok'testImplementation 'org.springframework.boot:spring-boot-starter-test'
}test {useJUnitPlatform()
}

从上述的配置文件可以看出,相比于 pom.xml 中的内容,build.gradle 还是要简洁很多的,它们的对比如下图所示:23026a8ffb8b0638c2171264fa70df13.png

3.3 打包项目

Gradle 和 Maven 打包项目类似,都是在 Idea 右侧点击即可生成,Maven 打包项目如下图所示:05e4b8ffd570f243998d4556949acd3b.png对应 Gradle 的打包如下:19e46fa0cf6c81d4ed225ec295c8332b.png

4.mvnd 使用

mvnd 使用是需要安装的,之前的文章已经介绍过了,这里就不再赘述了,点击详情查看:https://juejin.cn/post/7046187614990237732

5.性能对比

接下来创建两个新的 Spring Boot 2.5.8 + Java 8 测试打包的性能,具体测试结果如下。

5.1 Maven 打包性能

32b4c9a56f29e92a15aa7b7694d28f7f.pngMaven 首次打包所花费的时间是:6.524 秒。

5.2 mvnd 打包性能

b6ea0fae2adcef9c3a02a937e3044561.pngmvnd 首次打包所花费的时间是:4.832 秒,相比于 Maven 性能提升了 135%。

5.3 Gradle 打包性能

9a2bfec14b066a36e3ed28f91e714120.pngGradle 首次打包所花费的时间是:1.560 秒,相比于 Maven 性能提升了 418%,相比于 mvnd 性能提升了 300%。

扩展:Gradle 打包文件存放目录

Gradle 打包的文件存放在“项目根路径\build\libs”下,如下图所示:2338213e8404a0b76bd4b4995b4bba57.png

总结

虽然 mvnd 的目标是借鉴 Gradle 技术提供更快的 Maven 构建,但通过本文的测试发现,Gradle 打包的性能依然是最高的,相比于 Maven 性能提升了 418%,相比于 mvnd 性能提升了 300%,并且 Gradle 的配置文件更加的简单、易读,依然是最值得推荐的项目构建工具

是非审之于己,毁誉听之于人,得失安之于数。

c7ef131a0d3e1e0ffd75aac178681a0d.gif

往期推荐

0f2244ff1007570f1e6735e246dd1a20.png

更快的Maven来了,我的天,速度提升了8倍!


2ba56dceea0160b7a47c91e18c518f2e.png

Spring Boot Admin,贼好使!


c910b037816a21c44f8a79a4f314126a.png

保姆级教程,终于搞懂脏读、幻读和不可重复读了!

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

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

相关文章

页面访问的常见错误码解析

200 OK 一切正常301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。 302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTT…

aptitude_PHP Numbers Aptitude问题与解答

aptitudeThis section contains Aptitude Questions and Answers on PHP Numbers. 本节包含有关PHP数字的能力问题。 1) PHP supports automatic type conversion? YesNo Answer & Explanation Correct answer: 1Yes Yes, PHP supports automatic type conversion. 1)PHP…

SpringBoot + ShardingSphere 秒级分库分表!

Spring Boot 作为主流微服务框架,拥有成熟的社区生态。市场应用广泛,为了方便大家,整理了一个基于spring boot的常用中间件快速集成入门系列手册,涉及RPC、缓存、消息队列、分库分表、注册中心、分布式配置等常用开源组件&#xf…

JAVA基础之自定义容器实现

容器 容器主要是指Collection所包含的实现类,常用的有List、Map以及Set三种结构。本文主要介绍了几种常见的集合实现类,对它们进行自定义实现。 ArrayList:有序的容器列表,顺序存储着元素,可以使用下标进行索引&…

git reset, git checkout, git revert 区别 (译)

博客原文地址: http://blog.mexiqq.com/index.php/archives/3/题记:团队中大多数成员使用 sourceTree 和 github 两款 git 工具,然而大家对于图形化工具提供的 reset,checkout,revert 功能点并不是很了解,甚至于混淆,然后凭借猜测去使用。功夫…

Redis笔记之基本数据结构 动态字符串SDS

简单动态字符串 传统上的C语言的字符串表示是以空字符结尾的字符数组(C字符串),redis自己实现一个动态字符串(SDS),两者之间的区别以及使用SDS的好处有: 结构不同。C字符串以空字符结尾的字符…

weakhashmap_Java WeakHashMap size()方法与示例

weakhashmapWeakHashMap类的size()方法 (WeakHashMap Class size() method) size() method is available in java.util package. size()方法在java.util包中可用。 size() method is used to get the number of key-value pairs that exist in this map. size()方法用于获取此映…

扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

1. 实例的注入方式首先来看看 Spring 中的实例该如何注入,总结起来,无非三种:属性注入set 方法注入构造方法注入我们分别来看下。1.1 属性注入属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下:Service p…

在项目中引入领域驱动设计的经验

Chris Patuzzo近期在一次演讲中介绍了领域驱动设计(DDD)的原则,并结合一个基于Ruby on Rails的真实项目进行讲解。在这次项目之前,Chris所在的团队为重新设计公司的主营网站所做的两个概念验证都因为可伸缩性方面的问题而失败了。…

Redis笔记之基本数据结构 链表

链表 链表具有空间存储不连续,增删节点快的优点,因此redis在列表键、发布与订阅、慢查询、监视器等使用了链表作为底层实现。由于C语言中没有内置的链表实现,因此redis自己进行了实现。 双向链表。每个listtNode都有perv和next指针&#x…

treeset java_Java TreeSet iterator()方法与示例

treeset javaTreeSet类的iterator()方法 (TreeSet Class iterator() method) iterator() method is available in java.util package. iterator()方法在java.util包中可用。 iterator() method is used to iterate the elements of this TreeSet is ascending or increasing or…

SpringCloud组件:Ribbon负载均衡策略及执行原理!

大家好,我是磊哥。今天我们来看下微服务中非常重要的一个组件:Ribbon。它作为负载均衡器在分布式网络中扮演着非常重要的角色。本篇主要内容如下:在介绍 Ribbon 之前,不得不说下负载均衡这个比较偏僻的名词。为什么说它偏僻了&…

Redis笔记之基本数据结构 字典

字典 符号表、关联数组或者映射,有点类似于java中的map,用于保存键值对key-value。字典中的键key是独一无二的。底层实现为哈希表。下面进行简述: 哈希表。哈希表主要包含table数组、size、sizemask以及used。table用于保存哈希表节点&…

【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

本文目录 前言一、编写第一个C语言程序-Hello World二、编译程序三、链接程序四、运行程序五、总结六、学习建议七、clang指令汇总回到顶部前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法。学习任何一门语言&#xff…

安卓平板体验Java开发,还能白嫖一年阿里无影云,真香!(内含白嫖方法,人人可领)...

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)阿里无影云早有耳闻,前两天看朋友发体验照片,可能是程序员天生爱折腾的特性又发挥作用了&#xff0c…

Linux命令(三)

echo:输出信息echo ”abc”echo “字符串” |passwd --stdin USERNAME :利用管道修改用户密码输出重定向:>覆盖输出(会覆盖原文件中的内容)>>追加输出 (原有内容会被保留)Set –c &#xff1a…

strictmath_Java StrictMath scalb()方法与示例

strictmathStrictMath类scalb()方法 (StrictMath Class scalb() method) Syntax: 句法: public static double scalb(double do , int sf);public static float scalb(float fl , int sf);scalb(double do , int sf) method is used to return do* 2 raised to the…

你知道group by的工作原理和优化思路吗?

前言 日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?本文将跟大家…

strictmath_Java StrictMath hypot()方法与示例

strictmathStrictMath类hypot()方法 (StrictMath Class hypot() method) hypot() method is available in java.lang package. hypot()方法在java.lang包中可用。 hypot() method is used to return the square root of sqrt(sq(d1)sq(d2)) without any intermediate operation…

关Jquery判断input type=checkbox元素是否被选中的判断

2019独角兽企业重金招聘Python工程师标准>>> 在用到复选框的时候&#xff0c;想在js中判断chekbox是否被选中 <input name"isPermit" id"isPermit" type"checkbox"> 百度了很多的判断方法 1、 if($("#isPermit").att…