Gradle vs Maven 基本对比(一)

news2024/11/18 9:34:54

Gradle 与Maven 的基本对比

对比目录:

1、工具包目录对比
2、创建项目结构对比
3、启动进程对比
4、性能对比
5、简洁性对比

什么是gradle:

Gradle 是一个开源的运行在JVM上自动化构建工具,专注于灵活性和性能。Gradle 使用 Groovy 或 Kotlin DSL(领域特定语言) 语言来编写脚本。

  • groovy是Java扩展的脚本语言,最后编译为class,运行在jvm上。
  • gradle是由Java和groovy写的一个工具。
  • groovy和Java可以混写,gradle的源码中很多核心实现是Java写。
  • Maven是04年,gradle是08年。都比较长久了。

1、项目结构对比

maven/gradle的目录结构
在这里插入图片描述

  1. 非常的相似,bin就是一些二进制的执行文件
  2. 配置文件conf/init.d
  3. lib 启动需要jar
  4. gradle 下文是all.zip 所以有docs就是使用文档说明,src也就是源码,我们下载bin.zip 包是没有

init.gradle 配置文件

在这里插入图片描述

init.gradle 每次构建都会加载与maven的setting.xml类似
加载USER_HOME/.gradle/init.gradle文件
加载USER_HOME/.gradle/init.d/目录下的以.gradle结尾的文件
加载GRADLE_HOME/init.d/目录下的以.gradle结尾的文件
USER_HOME: ~/.gradle
GRADLE_HOME:
/Users/zmkj/.gradle/wrapper/dists/gradle-7.4-bin/c0gwcg53nkjbqw7r0h0umtfvt/gradle-7.4/init.d
执行该脚本,会创建 Gradle 对象;


USER_HOME:
~/.gradle
GRADLE_HOME:
/Users/zmkj/.gradle/wrapper/dists/gradle-7.4-bin/c0gwcg53nkjbqw7r0h0umtfvt/gradle-7.4/init.d

执行该脚本,会创建 Gradle 对象;

2、创建项目结构对比

  1. .gradle 目录
  2. .idea 目录
  3. gradle 文件夹
  4. build.gradle
  5. gradlew
  6. settings.gradle

在这里插入图片描述

1、gradle.properties

在这里插入图片描述

配置全局的参数,包括jvm的配置,gradle的工具的配置文件,网络代理等等

2、settings.gradle

在这里插入图片描述

只有根目录有一个这样的文件,
settings.gradle文件的作用:它提供的 include 方法,通过这个方法可以指定哪些工程需要参与编译,每一个参与编译的工程 ,Gradle 会为它创建一个 Project 对象;

类似maven的Modules
settings.gradle会被编译成一个Setting的class文件;

3、build.gradle

在这里插入图片描述

maven中的pom.xml文件类型,gradle的build.gradle ,每一项目都会有一个;
插件的引用,依赖的包,版本控制,依赖的仓库

build.gradle 会被编译成一个Project的class对象;根目录是父project,子项目是也会有Project;
每一个project都是由若干个task组成,task就是闭包类似函数;

在这里插入图片描述

gradle 文件夹:

在这里插入图片描述

Gradle Wrapper 文件的作用就是可以让你的电脑在不安装配置 Gradle 环境的前提下运行 Gradle 项目,你的机器要是没有配 Gradle 环境,下载指定版本gradle;
gradle-wrapper.properties
● distributionUrl --> Gradle 压缩包下载地址
● zipStoreBase --> 本机存放 Gradle 压缩包主地址
● zipStorePath --> 本机存放 Gradle 压缩包主路径
● Gradle 压缩包完整的路径是 zipStoreBase + zipStorePath
● distributionBase --> 本机 Gradle 压缩包解压后主地址
● distributionPath --> 本机 Gradle 压缩包解压后路径
● GRADLE_USER_HOME ->mac 就是~/.gradle/目录

gradlew、gradlew.bat 二进制文件
gradlew ->运行在mac,linux 机器上;
gradlew.bat ->运行在win机器上;

加载顺序:
gradle项目启动时会先加载init.gradle全局的配置文件,再加载settings.gradle ,加载根目录build.gradle,加载子项目build.gradle

3、Maven 与Gradle 启动

maven

我们执行mvn的一些的命令操作,加载maven的依赖与jar包,他会启动一个jvm进程,执行maven的生命周期,去做我们的项目的编译与打包操作,执行完之后会销毁这个进程;
plexus-classworlds-2.6.0.jar

Gradle

Gradle 主要有三种不同类型 JVM 进程:
● wrapper
● client
● Daemon
在这里插入图片描述

1、wrapper进程

当我们通过idea导入项目,或通过通过gradlew 执行命令,会去检查构建当前项目所需要的gradle版本在当前机器上是否有,我们新建一个gradle项目时都会指定构建的gradle版本,如果没有就会去下载gradle工具到 gradle.properties文件中配置的路径下;并启动 Gradle。

2、client jvm 进程

每次构建开始都会创建client进程,client 进程是个轻量级进程,构建结束会销毁这个进程。
client 进程的任务是查找启动Daemon进程并和 Daemon 进程socket通信:
● Daemon 进程没启动,client 进程会启动一个新的 Daemon 进程
● Daemon 进程已经存在了,client 进程就给 Daemon 进程传递本次构建相关的参数和任务,然后接收 Daemon 进程发送过来的日志
● 想gradle.properties 里面设置的参数,设置jvm参数,全局 init.gradle 初始化脚本的任务这些都需要 client 进程传递给 Daemon 进程
● damon进程执行完成之后,把结果同步到client;

Daemon jvm进程

daemon jvm 与client jvm 有兼容性 gradle daemon官网
也可以不启动daemon,通过参数设置 org.gradle.daemon=true
gradle-launcher-7.5.jar

daemon 进程负责具体的构建任务。gradle 3.0之前也是启动之后就杀死这个进程,3.0之后默认就是不杀死进程,可以在参数中配置;每一个版本的 Gradle 都会对应创建一个 Daemon 进程;不同的版本会有一定的差异性,所以会启动不同的daemon进程。
● Daemon 进程是独立存在,是一个守护进程,构建结束 Daemon 进程也不会销毁,而是会休眠,等待下一次构建,这样做是为了节省系统资源,加快构建速度;daemon 空闲3小时 销毁;
● Daemon 进程会缓存公共插件等项目信息
● 不需要每次去启动jvm进程
必须注意: 每一个 Gradle 版本都会对应一个 Daemon 进程,机器内若是运行过多个版本的 Gradle,那么机器内就会存在多个 Daemon 进程,所以需要统一gradle版本,如果是本地那就idea中配置Gradle

4、性能对比

官网性能对比:https://gradle.org/maven-vs-gradle/
● 增量构建
● 构建缓存
● Gradle 守护进程

4.1、增量构建

在这里插入图片描述

gradle为了提升构建的效率,提出了增量构建的概念,为了实现增量构建,gradle将每一个task都分成了三部分,分别是input输入,任务本身和output输出。下图是一个典型的java编译的task。

input就是目标jdk的版本,源代码等,output就是编译出来的class文件。
增量构建的原理就是监控input的变化,只有input发送变化了,才重新执行task任务,否则gradle认为可以重用之前的执行结果。
当我们的参数发生变化时,就会重新编译;
就是java里面的热编译差不多,只会重新加载哪些发生变化的文件,jrebel插件

4.2、构建缓存

gradle可以重用同样input的输出作为缓存,大家可能会有疑问了,这个缓存和增量编译不是一个意思吗?
在同一个机子上是的,但是缓存可以跨机器共享.如果你是在一个CI服务的话,build cache将会非常有用。因为developer的build可以直接从CI服务器上面拉取构建结果,非常的方便。

4.3、Gradle 守护进程

gradle会开启一个守护进程来和各个build任务进行交互,优点就是不需要每次构建都初始化需要的组件和服务。
同时因为守护进程是一个一直运行的进程,除了可以避免每次JVM启动的开销之外,还可以缓存项目结构,文件,task和其他的信息,从而提升运行速度。

使用gradle和maven构建 Apache Commons Lang 3的比较:

在这里插入图片描述

场景:小型多项目构建

10个模块,每个模块50个源文件和50个测试文件,最类似于一组微服务。的比较:

在这里插入图片描述

Gradle 干净构建的速度提高了 2-3 倍,增量更改的速度提高了大约 7 倍,而当 Gradle 任务输出被缓存时,速度提高了 14 倍。

场景:中型多项目构建

100 个模块的多项目的常见任务的结果。每个子项目有 100 个源文件和 100 个测试文件。
在这里插入图片描述

Gradle 对于干净构建的速度提高了 4-5 倍,对于增量更改的速度提高了大约 40 倍,而当 Gradle 任务输出被缓存时速度提高了 13 倍。

场景:大型多项目构建

500 个模块的多项目的常见任务的结果。每个子项目有 100 个源文件和 100 个测试文件。
在这里插入图片描述

Gradle 干净构建的速度提高了 3-10 倍,增量更改的速度提高了约 85 倍,Gradle 任务输出被缓存时速度提高了 13 倍。

场景:大型单体应用

此场景是此类项目的近似值 — 一个包含 50000 个源文件和 50000 个测试文件的项目。
在这里插入图片描述

Gradle 干净构建的速度提高了 2-3 倍,增量更改的速度提高了大约 7 倍,而当 Gradle 任务输出被缓存时,速度提高了 3 倍。

Spring boot 从maven切换Gradle

https://spring.io/blog/2020/06/08/migrating-spring-boot-s-build-to-gradle

结论
我们对迁移的进展以及我们所看到的构建时间的减少感到非常满意。 CI 构建现在平均需要大约 20 分钟,比以前快 3-4 倍。 本地构建平均需要 2 分 30 秒,比以前快 20-30 倍。
在这里插入图片描述

5、项目简洁性对比

先从我们的配置文件来看,maven的父pom文件,gradle的根build文件

我们的父目录文件,一般是引入一些插件,公共的依赖与版本的控制;

子项目的配置:
在这里插入图片描述

我们现在项目每一个项目都有一堆的版本管理控制配置信息;这对我们的版本统一管理与统一升级很不友好;比如我要审计一个jar包版本,比如fastjson,那你需要到每个项目修改做;
maven 里面也可以做,maven中我们一般的做法是写在引入一个父项目;
gradle 就相当灵活,在我们的bulid.gradle中引入一个gradle的配置文件就可以直接使用

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

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

相关文章

低代码平台飞速创软完成3000万元A+轮融资

疫情形势下,云原生全场景低代码及数字化基础设施提供商珠海飞速创软科技有限公司(以下简称:飞速创软)依然发展迅速,逆势而上。继2021年中获得珠海正菱创投、炼金术资本等机构A轮数千万融资之后,于2022年底&…

【手写 Vue2.x 源码】第三十一篇 - diff算法-比对优化(下)

一,前言 上篇,diff算法-比对优化(上),主要涉及以下几个点: 介绍了如何进行儿子节点比对;新老儿子节点可能存在的3种情况及代码实现;新老节点都有儿子时的 diff 方案介绍与处理逻辑…

墙裂推荐,2023年最强、最实用的IDEA插件推荐合集

插件目录Alibaba Java Coding Guidelines(阿里巴巴java开发规范)Alibaba Cloud AI Coding Assistant(阿里云AI代码助理)Code Glance3(代码地图)Codota AI Autocomplete for Java and JavaScriptCSDN Tools(CSDN官方插件)FindBugsGenerateAllSetter Postfix Completion (自动生成…

小程序uni-app的api

小程序uni-app的apiuni api简介uni api使用uni-app自定义组件—传统方式核心步骤uni-app自定义组件—easycom简介核心步骤uni-app组件库uViewUIuview介绍关键步骤uni api简介 uni-api 指的是uni-app 针对一些 微信小程序api所做的封装它解决了两个问题 原生的小程序api不支持…

C/C++const关键字详解(全网最全)

目录 1、const修饰普通变量 2、const修饰指针 (1)const修饰p: (2)const修饰*p: (3)const修饰p和*p 4、const修饰数组 5、const修饰函数形参 (1)const修饰普通形参…

【数据结构】6.4 图的存储结构

文章目录6.4.1 邻接矩阵(数组)表示法无向图的邻接矩阵无向图邻接矩阵的特点有向图的邻接矩阵有向图邻接矩阵的特点网(有权图)的邻接矩阵采用邻接矩阵创建无向网邻接矩阵的优缺点6.4.2 邻接表(链式)无向图的…

【人工智能原理自学】初识Keras:轻松完成神经网络模型搭建

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解初识Keras:轻松完成神经网络模型搭建,一起卷起来叭! 目…

Eureka入门

Eureka入门Eureka入门什么是Eureka构建项目demo服务拆分远程调用创建Pom聚合工程Eureka使用搭建注册中心注册服务远程调用出现的问题Eureka入门 什么是Eureka Eureka是SpringCloud提供的注册中心,用来解决微服务之间远程调用问题,如: 消费…

交通流的微观模型研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Redis原理篇(四)内存回收

Redis之所以性能强&#xff0c;最主要原因是基于内存存储。但是单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 可以通过配置文件来设置最大内存 # maxmemory <bytes> maxmemory 1gb一、过期策略 可以通过expire命令给Redis的key设置TTL …

【C++算法图解专栏】一篇文章带你掌握高精度加减乘除运算

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们一起交流~ &#x1f4da;专栏地址&#xff1a;https://blog.csdn.net/Newin…

Java 异常 笔记

异常体系结构 异常分为Error和Exception。Error通常是灾难性错误&#xff0c;一般发生时&#xff0c;JVM选择终止程序执行&#xff1b;Exception通常可在程序中进行处理&#xff0c;尽量避免 Exception分支中有一个重要子类RuntimeException&#xff0c;运行时异常 ArrayInd…

数据库,计算机网络、操作系统刷题笔记34

数据库&#xff0c;计算机网络、操作系统刷题笔记34 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

深入理解Promise

Promise的前提概念 Promise是一个构造函数&#xff0c;用来生成Promise实例 Promise构造函数接受一个函数作为参数&#xff0c;该函数有两个参数&#xff0c;分别是resolve和reject resolve&#xff1a;成功时的回调 reject&#xff1a;失败时的回调 Promise分别有三个状态 1…

行人属性识别研究综述(一)

文章目录摘要1、简介2 问题的表述和挑战3 标准3.1 数据集3.2 评价标准4 行人属性识别的常规流程4.1 多任务学习4.2 多标签学习5 深度神经网络&#x1f407;&#x1f407;&#x1f407;&#x1f407;&#x1f407;&#x1f407;&#x1f407; 欢迎阅读 【AI浩】 的博客&#x1f…

C#上位机基础学习_基于S7.Net实现读取S7-1500PLC中的字符串变量

C#上位机基础学习_基于S7.Net实现读取S7-1500PLC中的字符串变量 如下图所示,首先在TIA博途中创建一个项目,添加一个1500PLC,添加一个DB块,在DB块中添加几个字符串变量, 如下图所示,打开Visual Studio 2019,新建一个项目,在Form1中添加一个按钮和一个文本框, 如下图…

linux——高级信号

高级信号的收发发&#xff1a;siquequ收&#xff1a;sigaction() 包含三个元素num,sigaction()函数&#xff0c;备份num ->signumsigaction是一个结构体&#xff0c;需额外配置再传进来备份直接忽略&#xff0c;代表不需要备份sigaction结构体又包含四个元素sa_handler&…

Git进阶:修改上次提交 git commit --amend

一、问题说明 git commit 后&#xff0c;发现刚才的备注写错了&#xff0c;或者代码漏掉了&#xff0c;这时我们肯定是想取消刚才的提交。此刻有两种方法 &#xff08;1&#xff09;使用git reset命令将刚才的提交会退掉。需要注意的是git reset --soft 和git reset --hard的区…

【附源码】国内首届Discord场景创意编程开源项目

以下开源项目是由环信联合华为举办的《国内首届Discord场景创意编程赛》作品&#xff0c;附源码&#xff0c;一键即用。 一、 模拟器游戏直播-新新人类 新新人类模拟器游戏直播基于环信超级社区Demo构建&#xff0c;增加以“video-x”命名的新型Channel&#xff0c;用户可在本…

Java三目运算符导致 NPE

在三目运算符中&#xff0c;表达式 1 和 2 在涉及算术计算或数据类型转换时&#xff0c;会触发自动拆箱。当其中的操作数为 null 值时&#xff0c;会导致 NPE 。 一、基础知识 三目运算符 三目运算符是 Java 语言中的重要组成部分&#xff0c;它也是唯一有 3 个操作数的运算…