为什么劝你放弃Maven?看看Gradle的这些优点就知道了

相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:

  1. Maven的配置文件是XML格式的,假如你的项目依赖的包比较多,那么XML文件就会变得非常非常长;

  2. XML文件不太灵活,假如你需要在构建过程中添加一些自定义逻辑,搞起来非常麻烦;

  3. Maven非常的稳定,但是相对的就是对新版java支持不足,哪怕就是为了编译java11,也需要更新内置的Maven插件。

如果你对Maven的这些缺点也有所感触,准备尝试其他的构建工具,那么你可以试试gradle,这是一个全新的java构建工具,解决了Maven的一些痛点。


一、安装Gradle

最传统的安装方法就是去gradle官网下载二进制包,解压,然后将路径添加到环境变量中。如果你没什么其他需求,可以使用这种安装方式。但是,gradle是一个非常新潮的项目,每隔几个月就会发布一个新版本,这种方式可能跟不上gradle的更新速度。

所以我更加推荐使用包管理器来安装gradle。如果你使用linux系统,那么不必多说。如果你使用Windows系统,我推荐使用scoop包管理器来安装gradle。它安装方便,而且使用SHIM目录来管理环境变量,在各种工具中配置gradle也很方便。

当然,如果你完全不喜欢安装这么多乱七八糟的东西,那也可以使用gradle。gradle提供了一个名为gradle wrapper的工具,可以在没有安装gradle的情况下使用gradle。好吧,其实它就是个脚本文件,当你运行wrapper脚本的时候,如果脚本发现你电脑里没有gradle,就会自动替你下载安装一个。现在甚至还出现了Maven wrapper,也是个脚本文件,可以自动安装Maven。

之前相信一些朋友听说过gradle,然后尝试使用它,结果因为速度太慢,最后放弃了。之前我也因为gradle的速度,放弃了它一段时间。不过现在使用gradle的话会方便很多。gradle官方在中国开设了,CDN,使用gradle wrapper的时候下载速度非常快。可以说现在是一个学习使用gradle的好时候。

二、使用gradle wrapper

这里我使用的IDEA来创建和使用gradle项目。


IDEA默认就会使用gradle wrapper来创建项目,所以无需安装gradle也可以正常运行。这时候项目结构应该类似下图所示,使用Maven的同学应该比较熟悉,因为这和Maven的项目结构几乎完全一致。gradle文件夹和gradlew那几个文件就是gradle wrapper的文件,而.gradle后缀名的文件正是gradle的配置文件,对应于Maven的pom.xml。


gradle wrapper的优点之一就是可以自定义下载的gradle的版本,如果是团队协作的话,这个功能就非常方便,简单设置即可统一团队的构建工具版本。这里我就设定成目前最新的gradle 6.4.默认下载安装的是bin版,仅包含二进制。如果你使用IDEA的话,它会推荐下载all版,包含源代码,这样IDEA就可以分析源代码,提供更加精确的gradle脚本支持。


三、依赖管理

下面来看看gradle的依赖管理功能,这也算是我们使用构建工具的主要目的之一了。这点也是gradle相较maven的优势之一了。相较于maven一大串的XML配置,gradle的依赖项仅需一行。

dependencies {testImplementation 'junit:junit:4.13'implementation 'com.google.code.gson:gson:2.8.6'
}

这里推荐一下Jetbrains的package search网站,是寻找maven和gradle依赖包的最佳网站,可以非常轻松的搜索和使用依赖项。


gradle依赖的粒度控制相较于Maven也更加精细,maven只有compile、provided、test、runtime四种scope,而gradle有以下几种scope:

1.implementation,默认的scope。implementation的作用域会让依赖在编译和运行时均包含在内,但是不会暴露在类库使用者的编译时。举例,如果我们的类库包含了gson,那么其他人使用我们的类库时,编译时不会出现gson的依赖。

2.api,和implementation类似,都是编译和运行时都可见的依赖。但是api允许我们将自己类库的依赖暴露给我们类库的使用者。

3.compileOnly和runtimeOnly,这两种顾名思义,一种只在编译时可见,一种只在运行时可见。而runtimeOnly和Maven的provided比较接近。

4.testImplementation,这种依赖在测试编译时和运行时可见,类似于Maven的test作用域。

5.testCompileOnly和testRuntimeOnly,这两种类似于compileOnly和runtimeOnly,但是作用于测试编译时和运行时。

通过简短精悍的依赖配置和多种多样的作用与选择,Gradle可以为我们提供比Maven更加优秀的依赖管理功能。

四、gradle的任务和插件

gradle的配置文件是一个groovy脚本文件,在其中我们可以以编程方式自定义一些构建任务。因为使用了编程方式,所以这带给了我们极大的灵活性和便捷性。打个比方,现在有个需求,要在打包出jar的时候顺便看看jar文件的大小。在gradle中仅需在构建脚本中编写几行代码即可。而在Maven中则需要编写Maven插件,复杂程度完全不在一个水平。

当然,Maven发展到现在,已经存在了大量的插件,提供了各式各样的功能可以使用。但是在灵活性方面还是无法和Gradle相比。而且Gradle也有插件功能,现在发展也十分迅猛,存在了大量非常好用的插件,例如gretty插件。gretty原来是社区插件,后来被官方吸收为官方插件,可以在Tomcat和jetty服务器上运行web项目,比Maven的相关插件功能都强大。

虽然gradle可以非常灵活的编写自定义脚本任务,但是其实一般情况下我们不需要编写构建脚本,利用现有的插件和任务即可完成相关功能。在IDEA里,也可以轻松的查看当前gradle项目中有多少任务,基本任务如build、test等Maven和Gradle都是相通的。


五、配置镜像

Maven官方仓库的下载速度非常慢,所以一般我们要配置国内的镜像源。gradle在这方面和Maven完全兼容,因此只需稍微配置一下镜像源,即可使用Maven的镜像。如果你用gradle构建过项目,应该就可以在用户目录的.gradle文件夹下看到gradle的相关配置和缓存。

之前wrapper下载的gradle也存放在该文件夹下,位置是wrapper/dists。


而依赖的本地缓存在caches\modules-2\files-2.1文件夹下。目录结构和Maven的本地缓存类似,都是包名+版本号的方式,但是gradle的目录结构最后一层和Maven不同,这导致它们无法共用本地缓存。


言归正传,在gradle中配置下载镜像需要在.gradle文件夹中直接新建一个init.gradle初始化脚本,脚本文件内容如下。这样一来,gradle下载镜像的时候就会使用这里配置的镜像源下载,速度会快很多。再加上gradle wrapper在中国设置了CDN,现在使用gradle的速度应该会很快。

allprojects {repositories {maven {url "https://maven.aliyun.com/repository/public"}maven {url "https://maven.aliyun.com/repository/jcenter"}maven {url "https://maven.aliyun.com/repository/spring"}maven {url "https://maven.aliyun.com/repository/spring-plugin"}maven {url "https://maven.aliyun.com/repository/gradle-plugin"}maven {url "https://maven.aliyun.com/repository/google"}maven {url "https://maven.aliyun.com/repository/grails-core"}maven {url "https://maven.aliyun.com/repository/apache-snapshots"}}
}

当然,如果你有代理的话,其实我推荐你直接为gradle设置全局代理。因为gradle脚本实在是太灵活了,有些脚本中可能依赖了github或者其他地方的远程脚本。这时候上面设置的下载镜像源就不管用了。

所以有条件还是干脆直接使用全局代理比较好。设置方式很简单,在.gradle文件夹中新建gradle.properties文件,内容如下。中间几行即是设置代理的配置项。当然其他几行我也建议你设置一下,把gradle运行时的文件编码设置为UTF8,增加跨平台兼容性。

org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=10800
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=10800
systemProp.file.encoding=UTF-8
org.gradle.warning.mode=all

六、为什么使用gradle?

看到这里,你应该对gradle有了基本的了解, 也可以将其用于你的项目之中。但是如果你Maven已经非常熟悉了,可能不太愿意使用gradle,因为貌似没有必要。但是既然gradle出现了,就说明有很多人对Maven还是有一定的意见。因此在这里我来总结一下gradle相比maven的优势。

1.速度

gradle使用构建缓存、守护进程等方式提高编译速度。结果就是gradle的编译速度要远超maven,平均编译速度比Maven快好几倍,而且项目越大,这个差距就越明显。


2.灵活性

gradle要比Maven灵活太多,虽然有时候灵活并不是一件好事情。但是大部分情况下,灵活一点可以极大的方便我们。Maven死板的XML文件方式做起事情来非常麻烦。很多Maven项目都通过执行外部脚本的方式来完成一些需要灵活性的工作。而在gradle中配置文件就是构建脚本,构建脚本就是编程语言(groovy编程语言),完全可以自给自足,无需外部脚本。

3.简洁性

完成同样的功能,gradle脚本的长度要远远短于maven配置文件的长度。虽然很多人都说XML维护起来不麻烦,但是我觉得,维护一个光是依赖就有几百行的XML文件,不见得就比gradle脚本简单。

也许是因为我上面说的原因,也许有其他原因,不得不承认的一件事情就是gradle作为一个新兴的工具已经有了广泛的应用。spring等项目已经从Maven切换到了gradle。开发安卓程序也只支持gradle了。因此不管是否现在需要将项目从maven切换到gradle,但是至少学习gradle是一件必要的事情。

  最后你在用maven还是gradle呢?你觉得那个更好用?欢迎评论区留言互动~作者:乐百川来源:toutiao.com/i6824937779193971207往期推荐

List 集合去重的 3 种方法


磊哥最近面试了好多人,聊聊我的感受!(附面试知识点)

关注下方二维码,每一天都有干货!

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

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

相关文章

css中的换行符_如何使用CSS防止项目列表中的换行符?

css中的换行符Introduction: 介绍: Dealing with various items in CSS sometimes pose very different problems. The problem could be anything, it could be related to positioning, arrangement, and whatnot, therefore all such kinds of problems require…

Java中的一些坑,汇总篇(2万字)

Photo Drew Farwell 文 | 常意1.前言

6款html5模板下载

http://www.100sucai.com/code/1316.htmlhttp://www.100sucai.com/code/1318.htmlhttp://www.100sucai.com/code/1310.htmlhttp://www.100sucai.com/code/1309.htmlhttp://www.100sucai.com/code/1303.htmlhttp://www.100sucai.com/code/1301.html转载于:https://blog.51cto.co…

高并发系统 3 大利器之缓存

引言随着互联网的高速发展,市面上也出现了越来越多的网站和app。我们判断一个软件是否好用,用户体验就是一个重要的衡量标准。比如说我们经常用的微信,打开一个页面要十几秒,发个语音要几分钟对方才能收到。相信这样的软件大家肯定…

QTimer与事件循环理解

问题分析 最近在使用QT的时候发现了某些问题,查阅资料最后总结一下。我起初是想用QT在界面还在加载时加载一副动画,然后动画下面有加载的滚动条代表时间,由于测试所以界面加载没写很多东西很快就加载完成了。我就想让他加载慢点我看看效果。…

MYSQL 数学运算符问题

背景: 在mysql中 ’stringA stringB 这种类型的操作,在mysql内部会自动转化为两个double 数进行运算。 -------------------------------------------------------------------------------------------------------------------------------- 例子&a…

面试系列第1篇:常见面试题和面试套路有哪些?

作者 | 面哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)面试是人生中为数不多的改变自身命运的途径之一,当然有效的准备面试也是人生中为数不多的低投入高回报的…

漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!

之前一段时间,为我们发现的一个SaaS应用程序会间歇性地卡顿、变慢,因为很长时间都没有定位到原因,所以解决的办法就只能是重启。这个现象和之前我们遇到的程序变得卡顿不太一样,因为我们发现这个应用程序不仅在高流量期间时会变慢…

面试系列第2篇:回文字符串判断的3种方法!

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)回文字符串判断是面试和笔试中常见的面试题之一,同时也是 LeetCode 中一道经典的面试题,那么…

Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...

一、什么是Activity&#xff1f; 简单的说&#xff1a;Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面。在一个应用程序中通常由多个Activity构成&#xff0c;都会在Manifest.xml中指定一个主的Activity&#xff0c;例如以下设置 <actionandroid:name"androi…

阿里为什么推荐使用LongAdder,而不是volatile?

这是我的第 87 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;阿里《Java开发手册》最新嵩山版在 8.3 日发布&#xff0c;其中有一段内容引起了老王的注意&#…

当当花160买400的书,确定不囤一波?

天空飘来五个字&#xff0c;快要开学啦快快让路 ║ 今天我要去上学喽新学期我决定一定要努力学习没有新书给我充电怎么行&#xff1f;每次买完新书&#xff0c;感觉都是在开一场私人签售会哈哈哈这感觉真不错当当网自营图书大促>> 每满100减50 <<满200减100满300减…

万字详解Lambda、Stream和日期

作者&#xff1a;虚无境来源&#xff1a;cnblogs.com/xuwujing/p/10145691.html前言本篇主要讲述是Java中JDK1.8的一些语法特性的使用&#xff0c;主要是Lambda、Stream和LocalDate日期的一些使用。Lambda“Lambda 表达式(lambda expression)是一个匿名函数&#xff0c;Lambda表…

Java 中 10 大坑爹功能!

今天我们就来聊一下 Java 中的 10 大坑爹功能&#xff0c;它们分别是&#xff1a;1.switch必须加上break才结束2.逻辑运算符的“短路”现象3.数组下标从零开始4.ArrayList遍历删除时报错5.字符转成数字的坑6.while循环体的“障眼法”7.Integer类有缓存8.空方法体导致死循环9.神…

ORA-00304: requested INSTANCE_NUMBER is busy

为什么80%的码农都做不了架构师&#xff1f;>>> 昨天在项目现场弄oracle rac环境的时候&#xff0c;遇到了这个问题&#xff0c; 由于是rac环境&#xff0c;单独启动一个实例之后&#xff0c;在启动另外一个实例的时候报错了这个错误ORA-00304: requested INSTANCE…

多图证明,Java到底是值传递还是引用传递?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;开篇先来曝答案&#xff0c;在 Java 语言中&#xff0c;本质只有值传递&#xff0c;而无引用传递&#xff0c;解释和证明详见…

图解面试题:找出数组中重复的数字?

今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字。题目链接&#xff1a;https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/一、题目描述 找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0&#xf…

调研了100+开源博客,发现这5个最好用!

最近想倒腾一下博客&#xff0c;看了很多现成的比较成熟的开源博客系统&#xff0c;自己也简单从下面几个维度总结对比了一下&#xff1a;star 数量技术选型社区生态当然啦&#xff01;好东西不能独享&#xff0c;下面简单分享一下我所做的笔记&#xff08;文末有提供所有项目的…

3种时间格式化的方法,SpringBoot篇!

时间格式化在项目中使用频率是非常高的&#xff0c;当我们的 API 接口返回结果&#xff0c;需要对其中某一个 date 字段属性进行特殊的格式化处理&#xff0c;通常会用到 SimpleDateFormat 工具处理。SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd"…

linux系统怎么改为中文版(转)

linux系统安装好后怎么改为中文版呢&#xff1f;今天就跟大家介绍下linux系统改为中文版的方法&#xff0c;希望能帮助到大家&#xff01; 以下是linux系统改为中文版的四种方法&#xff0c;一起来看看&#xff1a; 方法1&#xff1a;写入环境变量 echo "export LANG"…