本文作者 :乐百川 来源: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 有一些地方用的让人不太舒服:
- 来 Maven 的配置文件是 XML 格式的,假如你的项目依赖的包比较多,那么 XML 文件就会变得非常非常长;
- 来 XML 文件不太灵活,假如你需要在构建过程中添加一些自定义逻辑,搞起来非常麻烦;
- 构建项目所需要的时间比较长;
如果你对 Maven 的这些缺点也有所感触,准备尝试其他的构建工具,那么你可以试试 Gradle,这是一个很不错的 Java 构建工具,解决了 Maven 的一些痛点。
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 wrapper 来创建项目,所以无需安装 Gradle 也可以正常运行。这时候项目结构应该类似下图所示,使用 Maven 的同学应该比较熟悉,因为这和 Maven 的项目结构几乎完全一致。Gradle 文件夹和 gradlew 那几个文件就是 Gradle wrapper 的文件,而.Gradle后缀名的文件正是 Gradle 的配置文件,对应于 Maven 的pom.xml。
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网站
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插件的任务
配置镜像
Maven 官方仓库的下载速度非常慢,所以一般我们要配置国内的镜像源。Gradle 在这方面和 Maven 完全兼容,因此只需稍微配置一下镜像源,即可使用 Maven 的镜像。如果你用 Gradle 构建过项目,应该就可以在用户目录的.Gradle 文件夹下看到 Gradle 的相关配置和缓存。
之前 wrapper 下载的 Gradle 也存放在该文件夹下,位置是 wrapper/dists。
gradle:现代高效的java构建工具
wrapper 下载的 Gradle 保存位置
而依赖的本地缓存在 caches\modules-2\files-2.1 文件夹下。目录结构和 Maven 的本地缓存类似,都是包名+版本号的方式,但是 Gradle 的目录结构最后一层和 Maven 不同,这导致它们无法共用本地缓存。
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 的优势。
- 速度, Gradle 使用构建缓存、守护进程等方式提高编译速度。结果就是 Gradle 的编译速度要远超 Maven,平均编译速度比 Maven 快好几倍,而且项目越大,这个差距就越明显。
大型多模块项目Maven和Gradle编译时间的对比,来自Gradle官网
-
灵活性, Gradle 要比 Maven 灵活太多,虽然有时候灵活并不是一件好事情。但是大部分情况下,灵活一点可以极大的方便我们。Maven 死板的 XML 文件方式做起事情来非常麻烦。很多 Maven 项目都通过执行外部脚本的方式来完成一些需要灵活性的工作。而在 Gradle 中配置文件就是构建脚本,构建脚本就是编程语言(Groovy 编程语言),完全可以自给自足,无需外部脚本。
-
简洁性, 完成同样的功能,Gradle 脚本的长度要远远短于 Maven 配置文件的长度。虽然很多人都说 XML 维护起来不麻烦,但是我觉得,维护一个光是依赖就有几百行的 XML 文件,不见得就比 Gradle 脚本简单。
也许是因为我上面说的原因,也许有其他原因,不得不承认的一件事情就是 Gradle 作为一个新兴的工具已经有了广泛的应用。spring 等项目已经从 Maven 切换到了 Gradle。开发安卓程序也只支持 Gradle 了。因此不管是否现在需要将项目从 Maven 切换到 Gradle,但是至少学习 Gradle 是一件必要的事情。
逆锋起笔
是一个专注于程序员圈子的技术平台,你可以收获最新技术动态
、最新内测资格
、BAT等大厂的经验
、精品学习资料
、职业路线
、副业思维
,微信搜索逆锋起笔
关注!
相关推荐
【maven】说明:Gradle maven工件发布与maven、maven发布、android maven Gradle插件的演练。该项目包含..., (Gradle maven artifacts publishing walkaround with maven , maven-publish , android-maven gradle ...
Gradle-Maven-Plugin是专门为Gradle 5.x版本设计的一个插件,它允许开发者使用Gradle构建系统来模拟Maven的发布流程,将工件部署到Maven仓库。这个插件对于那些同时使用Gradle和Maven的项目尤其有用,因为它实现了...
Maven 到 Gradle 将 Maven 依赖项转换为 Gradle 的非常基本的网页。 目前只解析 groupId、artifactId 和 version。 范围被忽略。 如果使用版本变量,它将保留它,但您仍然需要在 build.gradle 文件中定义该变量 ...
互联网资讯,技术简介,IT、AI技术,人工智能
1. **安装与配置**:首先,你需要确保本地已经安装了Gradle和Node.js,因为"Maven2Gradle"是用JavaScript编写的,需要Node.js环境来运行。 2. **获取项目依赖**:获取待转换的Maven项目的POM.xml文件,这通常是项目...
在实际应用中,Android Maven Gradle 插件的使用通常包括以下几个步骤: 1. 在项目的`build.gradle`文件中添加插件依赖: ```groovy buildscript { repositories { jcenter() } dependencies { classpath '...
### Eclipse集成Spring Boot、SVN、Gradle、Jetty、Maven等第三方插件 在现代软件开发过程中,集成开发环境(IDE)扮演着至关重要的角色。Eclipse作为一款广泛使用的开源IDE,提供了丰富的功能来支持Java开发人员的...
Gradle插件,创建一个UploadArchives任务,自动将所有Java、Kotlin或Android库上载到任何Maven实例。这个插件基于chris-banes的初始实现,并且已经被增强以添加kotlin支持并跟上最新的更改。
Gradle DMA (Dependency Management Assistant) 插件是为了解决开发者在使用Gradle构建系统时,对于依赖管理的一种Maven化解决方案。它旨在提供与Maven相似的依赖管理体验,使得那些习惯了Maven的开发者在转向Gradle...
Maven和Gradle是两种广泛使用的Java项目构建工具,它们各自有着独特的优势。本篇文章将详细探讨如何使用Maven来构建一个包含Gradle AspectJ功能的jar文件。 首先,让我们了解一下Maven。Maven是一种基于项目对象...
使用开源中国的 Maven 库可以帮助解决Gradle Metadata加载缓慢的问题。 Maven 库提供了许多有用的依赖关系和插件,可以帮助开发者快速构建和测试Android应用程序。 在 Android Studio 中使用 Maven 库可以按照以下...
主要介绍了详解阿里云maven镜像库配置(gradle,maven),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
综上所述,`gradle-generate-maven-pom`是一个帮助Gradle项目融入Maven生态的工具,使得Gradle构建的库能被广泛使用,无论用户是Gradle还是Maven用户。在实际开发中,理解和掌握这个过程对于跨平台的团队协作和代码...
Gradle Java-lib插件关于插件可以为Java或groovy库或gradle插件完成所有maven发布配置的样板(使用 )。 简化了POM配置和依赖性管理。 已准备好将配置的发布用于Maven Central(遵循所有中央规则)。 特征: 类似于...
Gradle Maven出版物 Gradle脚本/插件,可使用gradle maven或maven-publish插件帮助发布jar / aar工件。 该存储库包含两个组件:脚本和插件: 这些脚本的工作方式与但同时支持maven和maven-publish以及pom.xml更多...
Gradle DMT插件介绍一个Gradle插件,提供类似Maven的依赖项管理和排除。 该插件提供了DSL,以直接配置依赖管理,也可以通过导入现有的Maven Bom来配置。 基于配置的依赖项管理,该插件将控制项目的直接和传递依赖项...
SpringBoot、Gradle、Maven、Java和Groovy是Java生态系统中的重要组成部分,它们在现代软件开发中扮演着至关重要的角色。这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是...
提供Maven执行任务的Gradle插件 正在安装 此插件的发行版托管在。 使用以下两种方法之一将插件应用于您的项目。 在所有Gradle版本中使用的构建脚本代码段: buildscript { repositories { maven { url " ...
Gradle和Maven是两种广泛使用的构建工具,它们都提供了便捷的方式来下载并管理项目所需的外部库,如jar包。本篇文章将详细探讨如何使用Gradle下载jar包,以及它与Maven在处理依赖上的相似之处。 首先,让我们了解...
Gradle和Maven是两种广泛使用的构建工具,它们各自都有独特的优点和用法。本篇将深入探讨如何使用Gradle自定义Task和Plugin来发布Artifact,并将其部署到MavenLocal仓库。我们将主要关注`gradle-publish-to-Maven...