`

用完 Gradle 之后,有点嫌弃 Maven了

阅读更多

本文作者 :乐百川 来源:toutiao.com/i6824937779193971207

“工作之前,Guide 也是一直使用 Maven 。别人向我安利 Gradle 的时候,我总是不屑一顾,觉得这东西肯定没有 Maven 好,毕竟 Maven 这么多人用对吧!后面,在工作中真正用到它之后,才真正感受到它的好用。

我想表达意思是:当我们想要去评判一件事情的好坏之前,比如你的项目技术负责人把构建工具从 Maven 换成了 Gradle ,我们一定要首先了解这件事情的本质

个人感觉 Gradle 很多方面都比 Maven 要更好用!比如 Gradle 的项目依赖文件build.Gradle 比 Maven 的pom.xml更加清晰简洁(Maven 是因为 xml 的锅)、Gradel 还可以使用 Groovy 语言、自定义执行逻辑等等。

另外,在 Spring Boot 2.3.0.M1 中,将首次使用 Gradle 代替 Maven 来构建 Spring Boot 项目。迁移至 Gradle 主要是为了减少构建项目所花费的时间,因为 使用 Maven 构建项目花费的时间太多了。

Spring Boot 官方具体说明在这里:https://spring.io/blog/2020/06/08/migrating-spring-boot-s-build-to-gradle

终上所述,Guide 觉得大家还是很有必要学习一下 Gradle 的。

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

  1. 来 Maven 的配置文件是 XML 格式的,假如你的项目依赖的包比较多,那么 XML 文件就会变得非常非常长;
  2. 来 XML 文件不太灵活,假如你需要在构建过程中添加一些自定义逻辑,搞起来非常麻烦;
  3. 构建项目所需要的时间比较长;

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

gradle:现代高效的java构建工具gradle:现代高效的java构建工具

安装 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项目在IDEA中创建Gradle项目

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

gradle项目结构gradle项目结构

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 依赖包的很不错的网站,可以非常轻松的搜索和使用依赖项。

package search 网站地址:https://package-search.jetbrains.com/

package search网站package search网站

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

  • implementation :默认的 scope。implementation 的作用域会让依赖在编译和运行时均包含在内,但是不会暴露在类库使用者的编译时。举例,如果我们的类库包含了 gson,那么其他人使用我们的类库时,编译时不会出现 gson 的依赖。
  • api :和 implementation 类似,都是编译和运行时都可见的依赖。但是 api 允许我们将自己类库的依赖暴露给我们类库的使用者。
  • compileOnly 和runtimeOnly :这两种顾名思义,一种只在编译时可见,一种只在运行时可见。而runtimeOnly和 Maven 的provided比较接近。
  • testImplementation :这种依赖在测试编译时和运行时可见,类似于 Maven 的test作用域。
  • 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 都是相通的。

gretty插件的任务gretty插件的任务

配置镜像

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

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

gradle:现代高效的java构建工具gradle:现代高效的java构建工具

wrapper 下载的 Gradle 保存位置

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

gradle:现代高效的java构建工具gradle:现代高效的java构建工具

言归正传,在 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 快好几倍,而且项目越大,这个差距就越明显。

大型多模块项目Maven和Gradle编译时间的对比,来自Gradle官网

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

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

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

逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态最新内测资格BAT等大厂的经验精品学习资料职业路线副业思维,微信搜索逆锋起笔关注!

分享到:
评论

相关推荐

    [] - 2022-08-19 用完Gradle之后,我开始嫌弃Maven了!.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能

    2023 TikTok美妆个护市场分析:销售额、区域表现及本土化经营策略

    本文详细分析了2023年7月TikTok平台上美妆个护行业的市场表现。尽管7月份整体销售额环比下降10.4%,但美妆个护依然以21.59%的销售额占比稳居首位。直播带货占据了近七成的市场份额,显示出强大的销售能力。此外,东南亚国家如印尼、泰国和越南成为美妆个护的主要市场,尤其是印尼和泰国,分别占30.6%和25%的市场份额。产品方面,印尼市场偏好套装类产品,而泰国则更注重精华乳液类产品的销售。本土店铺在TikTok平台上的表现尤为突出,无论是在数量还是销售额上都占据主导地位。

    机械系统振动抑制:基于二质量模型的转矩补偿与主动阻尼MATLAB实现

    内容概要:本文详细介绍了利用MATLAB对二质量模型进行建模,并通过转矩补偿和加速度反馈两种方法来抑制机械系统中的振动和谐振问题。文中首先解释了二质量模型的基本概念及其在MATLAB中的实现方式,随后深入探讨了如何使用巴特沃斯高通滤波器提取转速波动来进行转矩补偿,以及怎样通过加速度反馈来等效增加电机惯量,从而达到主动阻尼的效果。此外,文章还展示了具体的代码实例和实际效果对比图,证明了所提出方法的有效性。 适用人群:从事机电一体化、自动化控制领域的工程师和技术人员,尤其是那些面临机械系统振动和谐振问题的专业人士。 使用场景及目标:适用于需要优化机械设备运行稳定性的场合,旨在减少因振动和谐振带来的负面影响,提高系统的可靠性和效率。同时,也为相关研究提供了理论依据和技术支持。 其他说明:随文附赠了完整的Simulink模型、参数调试攻略以及可用于嵌入式系统的C代码参考,便于读者进一步理解和实践。

    Delphi 12.3控件之ResizeKit2-D12-Athens.7z

    Delphi 12.3控件之ResizeKit2_D12_Athens.7z

    jsp见福便利店信息管理系统 lw.zip

    Java项目基于ssm框架的课程设计,包含LW+ppt

    四旋翼无人机轨迹跟踪的Matlab仿真:动力学模型与PID控制器设计

    内容概要:本文详细介绍了四旋翼无人机轨迹跟踪的Matlab仿真方法。首先,文章解释了四旋翼无人机在多个领域的应用及其重要性,并强调了精确轨迹跟踪的意义。接着,作者展示了如何利用Matlab建立四旋翼无人机的动力学模型,包括定义关键参数如质量、重力加速度、转动惯量等,并构建状态空间模型。随后,文章深入探讨了PID控制器的设计,提供了具体的PID参数设置和控制算法实现步骤,通过不断调整控制输入使无人机能够跟随预设轨迹。此外,文中还包括了仿真结果的展示,如正弦曲线轨迹跟踪的效果,并分享了调试过程中遇到的问题及解决方法。最后,作者推荐了一些学习资料,帮助读者更好地理解和掌握四旋翼无人机轨迹跟踪的相关知识和技术。 适合人群:对四旋翼无人机轨迹跟踪感兴趣的初学者、研究人员以及希望深入了解Matlab仿真的工程师。 使用场景及目标:①学习四旋翼无人机的动力学建模;②掌握PID控制器的设计与实现;③通过Matlab仿真平台验证和优化轨迹跟踪算法。 其他说明:文章不仅提供了理论知识,还有丰富的实例代码和实践经验分享,有助于读者快速入门并在实践中不断提高技能。

    人工智能入门资料Python学习数据代码

    人工智能入门资料Python学习数据代码

    OceanBase OBCP 实验指导手册V1.3

    OceanBase OBCP 实验指导手册V1.3

    2012-2021深圳市分区(常住)户籍人口(万人)

    (常住)户籍人口指在某个地区拥有户籍登记的人口,即户口所在地为该地区的人口。

    Good Things - NINE PERCENT.flac

    Good Things - NINE PERCENT.flac

    ssm汉服文化平台网站lw+ppt.zip

    Java项目基于ssm框架的课程设计,包含LW+ppt

    Delphi 12.3控件之nrComm Lib Pro v9.69 D7-XE7-XE10.4-XE11-XE12.1 Cracked.7z

    Delphi 12.3控件之nrComm Lib Pro v9.69 D7-XE7-XE10.4-XE11-XE12.1 Cracked.7z

    图神经网络中注意力机制的应用及其最新研究进展

    内容概要:本文详细探讨了图神经网络(GNN)与注意力机制的结合,特别是在图结构数据处理中的应用。文章首先简要介绍了图神经网络和注意力机制的概念,接着重点介绍了图注意力网络(GAT),以及其他几种基于注意力机制的图神经网络模型,如GATE、GaAN、RGAT等。文中还讨论了这些模型在节点分类、图分类、链接预测等任务中的具体应用,并指出了现有模型存在的问题及改进措施。最后,文章展望了未来的研究方向,强调了提升模型表达能力、增强可解释性和构建多尺度结构的重要性。 适合人群:从事图神经网络研究的科研人员、研究生及相关领域的从业人员。 使用场景及目标:① 提升图神经网络在处理复杂图结构数据时的性能;② 改善图神经网络的可解释性和可视化能力;③ 设计更高效的图注意力机制以应对大规模图数据。 其他说明:本文不仅回顾了图注意力网络的经典模型,还介绍了最新的研究成果,为未来的研究提供了有价值的参考。

    MATLAB建模优化纯电动车二档变速器换档策略与速比选择

    内容概要:本文探讨了如何通过优化换档策略来提升纯电动车的性能表现,特别是在动力性和经济性之间的平衡。文中详细介绍了基于MATLAB的数学模型构建方法,包括动力学模型和优化模型。动力学模型考虑了能量消耗、驱动力计算和等速油耗等因素,而优化模型则旨在最小化单位距离内的能量消耗,同时满足多种约束条件。此外,文章还展示了具体的MATLAB代码实现,用于参数设置、目标函数定义、约束条件设定和优化求解。最终,通过运行代码,获得了最优换档策略,显著提升了车辆的性能表现。 适用人群:从事电动车动力系统优化的工程师和技术研究人员。 使用场景及目标:①帮助工程师理解和掌握如何通过MATLAB建模优化电动车的换档策略;②为电动车设计师提供理论依据和技术支持,以提升车辆的续航能力和动力输出;③适用于电动车变速器优化的研究和开发项目。 其他说明:文章强调了换档策略对电动车性能的重要性,并指出合理的换档策略可以通过优化电池能量利用率来改善车辆的整体性能。同时,文章提供了详细的代码示例,便于读者理解和实践。 标签:MATLAB, 电动车, 换档策略, 数学建模, 非线性规划

    培训课件2-Web安全防护

    培训课件2-Web安全防护

    基于web的考试系统毕业设计论文

    基于web的考试系统毕业设计论文

    Trae 安装包,2025年3月27日下载最新版

    中国首个AI原生集成开发环境(AI IDE)Trae 国内版正式上线,配置Doubao-1.5-pro,并支持切换满血版DeepSeek R1、V3模型,让编程速度起飞。 作为更贴合中国开发者开发习惯与开发场景的AI IDE,Trae 以动态协作为核心,打造了一种人机协同,人与AI互相增强的全新开发体验,助力开发者高效应对复杂技术挑战,释放创新潜能。

    Delphi 12.3控件之SiComponents TsiLang Components Suite V7.6.0.1 for D7-DX10.3 WIN32-WIN64 ONLY.7z

    Delphi 12.3控件之SiComponents TsiLang Components Suite V7.6.0.1 for D7-DX10.3 WIN32-WIN64 ONLY.7z

    硬件课程设计-基于Logisim的单周期CPU硬件设计(CPU硬件实现+推箱子游戏).zip

    硬件课程设计-基于Logisim的单周期CPU硬件设计(CPU硬件实现+推箱子游戏).zip [项目介绍] 一个基于Logisim的单周期CPU硬件设计项目。该项目包含了一个单周期CPU的硬件实现和一个推箱子游戏的演示程序。 主要功能 实现了一个单周期CPU的硬件设计 提供了一个推箱子游戏的演示程序 使用Logisim作为开发工具 【技术栈】 硬件设计: 单周期CPU 开发工具: Logisim

    2000-2019年各省地方财政罚没收入数据

    2000-2019年各省地方财政罚没收入数据 1、时间:2000-2019年 2、来源:国家统计j、统计nj 3、指标:行政区划代码、地区、年份、地方财政罚没收入 4、范围:31省

Global site tag (gtag.js) - Google Analytics