Labs 导读
Maven和Gradle都是我们程序猿们日常开发必不可少的构建工具,但两者还是有很大的不同之处的:1.可扩展性,Gradle比较灵活,maven的灵活性就差一些,但是maven的项目比较容易看懂,并且上手简单;2.性能比较,Gradle比maven运行得快。Gradle无论是在可扩展性还是在性能方面都优于Maven。
相信作为Java开发者的你早已经受够了maven的编译缓慢,但是又由于历史包袱、使用习惯等问题暂时切换不了其他更快的构建工具,这里介绍一款更快的Maven——maven-mvnd[1]。
Part 01
介绍
mvnd并不是对Maven进行了重构,而是内置了Maven。它实际上是一个或者多个Maven守护进程,用来执行实际的构建服务。一个守护进程实例可以为来自mvnd客户端的多个连续请求提供Maven构建服务。当没有空闲的守护进程时来支撑构建请求时,mvnd可以并行生成多个守护程序。
使用GraalVM代替JVM
mvnd之所以快是因为它使用了GraalVM替代了传统的JVM,因此它启动更快,占用内存更少,而且在实行构建时不需要为每个构建启动新的JVM。另外Maven插件在构建时不再需要多次加载,而是缓存在多个构建中。SNAPSHOT版本的Maven插件不会被缓存。
支持JIT
GraalVM的JIT(Just In Time)实时编译特性也被运用到Maven构建作业中。JIT可以大大降低编译时间,在重复构建过程中,JIT优化代码立即可用,也极大提高了构建效率。
并行构建
目前Maven 3的并行构建(parallel builds)还是实验特性,而且要求使用的插件必须是线程安全的。而mvnd默认就支持使用多个CPU内核进行并行构建。当然如果你的源代码不支持并行构建,也可以通过添加- T1参数切换到串行构建。
Part 02
简单尝试
- 安装
目前mvnd已经支持Linux、MacOS、Windows平台。你可以分别通过SDKMAN、Homebrew、Chocolatey这些包管理器进行安装。也可以直接去mvnd发行版仓库[2]下载对应的二进制进行安装。这里以Windows为例,小编选择 从mvnd发行版仓库[2]下载压缩包,如下图所示:
图片
选择下载 maven-mvnd-1.0-m6-m40-windows-amd64.zip版本。
- 配置
配置很简单,只需要注意几点:
如果不使用包管理器进行安装的话请确保mvnd的bin目录关联到PATH。
解压后修改配置文件,修改conf/mvnd.properties。拉到底部修改settings文件目录,可以指向原安装maven中的xml文件,也可单独放到一个目录中。
图片
如果没有配置或者不想配置JAVA_HOME环境变量的话请在~/.m2/mvnd.properties中设置java.home以指定Java目录,例如:java.home=C:\\AdoptOpenJDK\\jdk-8。已经配置环境变量的请忽略该条。
其他配置可参考mvnd配置[3]。
- 验证
环境变量配置完成,在cmd的任意地址,可以识别到bin下的 mvnd 命令输入mvnd -version查看版本信息,输出如下信息代表安装成功!
图片
- 使用
在使用上与Maven的用法是完全相同的,只需将命令mvn改为mvnd即可。而在笔者本机的实测中,与传统的Maven相比,通过mvnd的构建所耗费的时间大约是原来的1/2。
- maven构建
图片
- mvnd构建(并行)
图片
- mvnd构建(串行)
图片
Part 03
总结
由于GraalVM的加持,这个工具很可能会延长Maven的生命,避免过早被Gradle拉开优势。对于我们来说,这个项目可以观望一下,看看Apache Maven官方的进一步动作。
👉参考文献
[1] maven-mvnd: https://github.com/apache/maven-mvnd.
[2] mvnd发行版仓库: https://github.com/mvndaemon/mvnd/releases.
[3] mvnd配置: https://github.com/mvndaemon/mvnd/blob/master/dist/src/main/distro/conf/mvnd.properties.