0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

推荐一款现代高效的java构建工具

jf_ro2CN3Fa 来源:头条 2023-02-24 11:22 次阅读

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

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

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

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项目。

8a86e69a-b37f-11ed-bfe3-dac502259ad0.jpg

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

8ab05796-b37f-11ed-bfe3-dac502259ad0.jpg

gradle wrapper的优点之一就是可以自定义下载的gradle的版本,如果是团队协作的话,这个功能就非常方便,简单设置即可统一团队的构建工具版本。

这里我就设定成目前最新的gradle 6.4.默认下载安装的是bin版,仅包含二进制。如果你使用IDEA的话,它会推荐下载all版,包含源代码,这样IDEA就可以分析源代码,提供更加精确的gradle脚本支持。

8ac8925c-b37f-11ed-bfe3-dac502259ad0.jpg

三、依赖管理

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

dependencies{
testImplementation'junit4.13'
implementation'com.google.code.gson2.8.6'
}

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

8ae4e95c-b37f-11ed-bfe3-dac502259ad0.jpg

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都是相通的。

8b0a6452-b37f-11ed-bfe3-dac502259ad0.jpg

五、配置镜像

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

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

8b43bdce-b37f-11ed-bfe3-dac502259ad0.jpg

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

8b73994a-b37f-11ed-bfe3-dac502259ad0.jpg

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

8b956822-b37f-11ed-bfe3-dac502259ad0.jpg

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

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

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






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    595

    浏览量

    27485
  • JAVA
    +关注

    关注

    19

    文章

    2974

    浏览量

    105048
  • XML文件
    +关注

    关注

    0

    文章

    5

    浏览量

    2030
  • maven
    +关注

    关注

    0

    文章

    30

    浏览量

    3731

原文标题:换掉 Maven,我用它!!!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Zephyr的构建工具

    给大家介绍下Zephyr的构建工具们:
    的头像 发表于 12-05 09:51 760次阅读
    Zephyr的<b class='flag-5'>构建工具</b>

    常用根文件系统构建工具有哪些

    11、/mnt目录12、/tmp目录二、常用根文件系统构建工具简介1、BusyBox工具2、Buildroot工具3、Yocto工具、简介
    发表于 11-05 07:28

    RT-Thread系统中的Scons构建工具资料推荐

    1 构建工具(系统)1.1 什么是构建工具(系统)构建工具 (software construction tool) 是种软件,它可以根据
    发表于 05-07 15:35

    介绍一款非常方便的java领域docker镜像构建工具

    前言本文主要介绍的是google开源的java领域的docker构建工具jib.目前在github上的start有8.5k,fork有784,是一款非常方便的
    发表于 07-19 17:41

    如何将PyFlasher与Johny Mattsson的预构建工具链结合使用?

    我通常使用 Marcel 的云构建服务和 PyFlasher 来构建和刷新固件,但我最近尝试在 UbuntuOnWindows 下使用 Johny Mattsson 的预构建工具链(现在它似乎相当
    发表于 04-28 07:27

    RVCT 3.0 SP1构建工具-错误和警告

    RVCT 1.2,请参考“ADS 1.2构建工具-错误和警告”文档。 如果您使用的是RVCT的早期版本,那么可以将此作为第个参考来源,但“RVCT2.0构建工具-错误和警告”也可能有用。
    发表于 08-16 06:30

    面向Eclips的Nios II软件构建工具手册

    面向Eclips的Nios II软件构建工具手册 The Nios II Software Build Tools (SBT) for Eclipse is a set of plugins
    发表于 10-17 15:43 37次下载

    使用Nios II软件构建工具

    使用Nios II软件构建工具 This chapter describes the Nios II Software Build Tools (SBT), a set of utilities
    发表于 10-17 15:49 20次下载

    Nios II软件构建工具入门

    Nios II软件构建工具入门 The Nios II Software Build Tools (SBT) allows you to construct a wide variety
    发表于 10-17 15:51 29次下载

    java开发

    不同的IDE,这些IDE提供了多种功能,如:构建Java应用、 TestNG、调试、代码检查、代码帮助、JUNIT测试、多元重构、可视化GUI构建器和代码编辑器、Java和Maven
    发表于 08-28 10:47 9次下载

    2022 RT-Thread全球技术大会:RT-Thread的常见构建工具

    RT-Thread的常见构建工具主要有以下图中的几种,同时介绍了相关特点
    的头像 发表于 05-27 14:39 898次阅读
    2022 RT-Thread全球技术大会:RT-Thread的常见<b class='flag-5'>构建工具</b>

    跨平台构建工具xmake简介与安装使用说明

    大家好,我是ZhengN。本次给大家分享个优秀的跨平台构建工具
    的头像 发表于 07-19 15:52 6192次阅读

    RT-Thread CMake构建工具

    RT Thread原生使用的构建工具是SCons,编译工具链使用官方提供的env工具,内含多种嵌入式常用的编译环境和脚本,可以算得上环境万能百宝箱。
    的头像 发表于 10-12 17:06 750次阅读
    RT-Thread CMake<b class='flag-5'>构建工具</b>

    介绍一款基于java的渗透测试神器-CobaltStrike

    Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器。
    的头像 发表于 01-16 09:16 1077次阅读
    介绍<b class='flag-5'>一款</b>基于<b class='flag-5'>java</b>的渗透测试神器-CobaltStrike

    ​介绍一款Java开发的开源MES系统

    ​介绍一款Java开发的开源MES系统,万界星空科技开源的MES系统。该系统基于Java开发,具有广泛的适用性和高度的可定制性,能够满足不同行业、不同规模企业的智能制造需求。
    的头像 发表于 09-05 17:39 735次阅读
    ​介绍<b class='flag-5'>一款</b><b class='flag-5'>Java</b>开发的开源MES系统