当前位置: 首页 > 后端技术 > Java

抱歉,Maven是时候改变了!

时间:2023-04-02 01:22:28 Java

相信用过Java的同学都用过Maven,这是一款非常经典好用的项目构建工具。但是如果你经常使用Maven,你可能会发现Maven有些地方让人不舒服:首先,Maven的配置文件是XML格式的。如果你的项目依赖很多包,XML文件就会变得非常非常长;其次,XML文件不是很灵活,如果在构建过程中需要添加一些自定义逻辑,会很麻烦;第三,Maven很稳定,但是相对来说,缺乏对新版java的支持,即使是为了编译java11,内置的Maven插件也需要更新。如果你感受到了Maven的这些不足,准备尝试其他的构建工具,那么你可以试试gradle,这是一个全新的java构建工具,解决了Maven的一些痛点。转用gradle后我不得不承认的一件事是,gradle作为一种新兴工具已经被广泛使用。spring等项目已经从Maven转为gradle。Android程序的开发只支持gradle。所以不管你现在是否需要把项目从maven切换到gradle,至少学习gradle是一个必要的事情。![图片](https://img-blog.csdnimg.cn/b...)安装gradle最传统的安装方式是从gradle官网下载二进制包,解压,然后添加环境变量的路径。如果没有其他需求,可以使用这种安装方式。不过gradle是一个很新潮的项目,每隔几个月就会发布一个新版本。这种方法可能跟不上gradle的更新速度。所以我推荐使用包管理器来安装gradle。如果你用的是linux系统,那就不用说了。如果您使用的是Windows,我建议使用scoop包管理器来安装gradle。安装简单,使用SHIM目录管理环境变量,在各种工具中配置gradle也很方便。当然,如果你根本不喜欢安装那么多乱七八糟的东西,你也可以使用gradle。Gradle提供了一个名为gradlewrapper的工具,可以在不安装gradle的情况下使用gradle。嗯,它实际上是一个脚本文件。当你运行wrapper脚本时,如果脚本发现你的电脑中没有gradle,它会自动为你下载并安装一个。现在甚至还有一个Mavenwrapper,也是一个可以自动安装Maven的脚本文件。相信之前有小伙伴听说过gradle,然后尝试使用,但是因为速度太慢,最终还是放弃了。我也有一段时间放弃了gradle因为它的速度。不过现在用gradle会方便很多。Gradle在中国正式开通,CDN,使用gradlewrapper下载速度非常快。可以说,现在正是学习使用gradle的好时机。使用gradlewrapper这里我使用IDEA来创建和使用gradle项目。IDEA默认会使用gradlewrapper创建项目,所以不用安装gradle也能正常运行。此时的项目结构应该类似于下图所示。使用过Maven的同学应该不会陌生,因为它和Maven的项目结构几乎一模一样。gradle文件夹和gradlew文件为gradlewrapper文件,.gradle后缀文件为gradle配置文件,对应Maven的pom.xml。gradlewrapper的一个优点是可以自定义下载的gradle版本。如果是团队协作,这个功能就很方便了。简单的设置就可以统一团队的构建工具版本。这里我设置为最新的gradle6.4。默认下载安装的是bin版本,只包含binary。如果使用IDEA,会推荐下载all版本,包括源码,方便IDEA分析源码,提供更准确的gradle脚本支持。#依赖管理我们来看看gradle的依赖管理功能,这也是我们使用构建工具的主要目的之一。这也是gradle相对于maven的优势之一。相比maven一大串的XML配置,gradle的dependencies只需要一行。dependencies{testImplementation'junit:junit:4.13'implementation'com.google.code.gson:gson:2.8.6'}这里我推荐Jetbrains的包搜索网站,这是最好的寻找maven和gradle依赖包的网站,这可以很容易地搜索和使用依赖项。gradle依赖的粒度控制也比Maven更细。Maven只有四个作用域:compile、provided、test、runtime,而gradle有以下作用域:1.Implementation,默认作用域。实现作用域导致在编译时和运行时包含依赖项,但不会在编译时向库使用者公开。比如我们的类库中包含gson,那么当别人使用我们的类库时,编译时就不会出现gson依赖。2.API,类似于implementation,是编译和运行时可见的依赖。但是api允许我们将我们类库的依赖暴露给我们类库的用户。3.compileOnly和runtimeOnly,顾名思义,一个只在编译时可见,一个只在运行时可见。而runtimeOnly更接近于Maven的提供。4.testImplementation,这个依赖在测试编译时和运行时都是可见的,类似于Maven的testscope。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项目中有多少任务。构建和测试等基本任务类似于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在下载镜像的时候,会使用这里配置的镜像源来下载,速度会快很多。另外gradlewrapper在国内架设了CDN,现在使用gradle的速度应该很快。allprojects{存储库{maven{urlhttps://maven.aliyun.com/repository/public}maven{urlhttps://maven.aliyun.com/repository/jcenter}maven{urlhttps://maven.aliyun.com/repository/spring}maven{urlhttps://maven.aliyun.com/repository/spring-plugin}maven{urlhttps://maven.aliyun.com/repository/gradle-plugin}maven{urlhttps://maven.aliyun.com/repository/google}maven{urlhttps://maven.aliyun.com/repository/grails-core}maven{urlhttps://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-8systemProp.http.proxyHost=127.0.0.1systemProp.http.proxyPort=10800systemProp.https.proxyHost=127.0.0.1systemProp.https.proxyPort=10800systemProp.file.encoding=UTF-8org.gradle.warning.mode=all为什么要用gradle?看到这里,你应该对gradle有了一个基本的了解,你也可以在你的项目中使用它。但是如果你已经非常熟悉Maven,你可能不太愿意使用gradle,因为它看起来没有必要。但是既然gradle出现了,说明很多人对Maven还是有一定的看法的。所以这里我总结一下gradle相对于maven的优势。首先,第一个也是最重要的一点是速度。Gradle使用构建缓存、守护进程等来提高编译速度。结果是gradle的编译速度远快于maven,平均编译速度比maven快数倍,而且项目越大,差距越明显。第二点是灵活性。Gradle比Maven灵活得多,尽管有时灵活性并不是一件好事。但在大多数情况下,灵活可以极大地方便我们。Maven死板的XML文件方式,做事很麻烦。许多Maven项目通过执行外部脚本来执行需要灵活性的工作。在gradle中,配置文件就是构建脚本,构建脚本就是编程语言(groovy编程语言),完全自给自足,不需要外部脚本。第三点是gradleDSL带来的简单。完成同样的功能,gradle脚本的长度远小于maven配置文件的长度。虽然很多人说XML维护起来不麻烦,但是我觉得光是维护一个有几百行依赖的XML文件,不一定比一个gradle脚本简单。也许是因为我上面说的原因,也许还有其他原因,有一点我不得不承认的是,gradle作为一个新兴的工具已经被广泛使用。spring等项目已经从Maven转为gradle。Android程序的开发只支持gradle。所以不管你现在是否需要把项目从maven切换到gradle,至少学习gradle是一个必要的事情。来源:今日头条/i6824937779193971207