使用 mvnd 加快 Maven 项目构建速度
昨天看到一篇文章,介绍 mvnd 1.0 正式发布,可以提高构建速度, 于是在自己电脑上测试了一下确实能提高不少速度。
在网上查了一下,并没有找到 mvnd 1.0 的镜像,于是自己便制作了一下镜像。
如果 package 中包含中文文件名的文件,可能存在打包异常,请执行
LANG=C.UTF-8
命令后再打包(PS. 查看字符命令locale
)
仓库与代码
仓库/地址 | 仓库类型 | 说明 |
---|---|---|
maven-mvnd | GitHub 仓库 | Apache 项目,制作镜像的源代码仓库 |
mvnd | GitHub 仓库 | 作者仓库,使用 maven-mvnd 制作镜像的仓库源码 |
mvnd | Gitee 仓库 | 作者仓库,国内使用 |
mvnd | GitLab 仓库 | 作者仓库,用于在国外构建镜像,提高拉取镜像、构建镜像、推送镜像的速度 |
测试准备
作者使用 个人自建GitLab
测试 mvnd
构建,更符合多数国内公司的使用场景
- 2015 年笔记本
- 2 核 4 线程
- 16G 内存,长期固定内存占用超过 9G
使用 pig 项目作为测试项目
- master 为 JDK 8 分支
- jdk17 为 JDK 17 分支
- 已上两个分支均测试
相关镜像列表
Docker Hub 镜像 | 国内镜像 | 说明 |
---|---|---|
xuxiaoweicomcn/mvnd:1.0.0-dragonwell-8-anolis | registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-8-anolis | 1.0.0 代表 mvnd 版本 |
xuxiaoweicomcn/mvnd:1.0.0-dragonwell-11-anolis | registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-11-anolis | dragonwell-8 代表使用的是阿里巴巴 JDK 8 |
xuxiaoweicomcn/mvnd:1.0.0-dragonwell-17-anolis | registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-17-anolis | anolis 代表是阿里云的龙蜥系统,兼容 CentOS |
测试 mvn CI/CD
mvn JDK 8 CI/CD
yaml
build-mvn:
stage: build
image: registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/maven:3.6.3-jdk-8
script:
- mvn clean package
cache:
key: "${CI_JOB_NAME}"
paths:
- .m2/repository
mvn JDK 17 CI/CD
yaml
build-mvn:
stage: build
image: registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/maven:3.6.3-openjdk-17
script:
- mvn clean package
cache:
key: "${CI_JOB_NAME}"
paths:
- .m2/repository
测试 mvnd CI/CD
mvnd JDK 8 CI/CD
yaml
build-mvnd:
stage: build
image: registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-8-anolis
script:
- mvnd clean package
cache:
key: "${CI_JOB_NAME}"
paths:
- .m2/repository
mvnd JDK 17 CI/CD
yaml
build-mvnd:
stage: build
image: registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-17-anolis
script:
- mvnd clean package
cache:
key: "${CI_JOB_NAME}"
paths:
- .m2/repository
构建时间
环境 | mvn CI/CD | mvn 耗时 | mvnd CI/CD | mvnd 耗时 | 耗时(mvnd ÷ mvn) |
---|---|---|---|---|---|
JDK 8 | jobs/1306 | 54.359 s | jobs/1304 | 36.391 s | 66.95 % |
JDK 17 | jobs/1298 | 41.450 s | jobs/1307 | 30.033 s | 72.46 % |
分析
- 无论 JDK 是 8 还是 17,速度都有不少的提升
- 测试耗时影响因素比较多,比如服务器的 CPU、内存 型号及当前占用率等,测试环境相对稳定,结果比较可信
- 使用 mvn 直接构建时,本身就不超过 1 分钟,使用 mvnd 提升效果可能看上去并不明显,如果使用 mvn 构建时间比较长,测试效果可能会更突出
- 由于 mvnd 的设计原理,可以重复构建效率提升更多,此处使用独立的环境,构建完成便立即销毁,所以无法测试重复构建的效率
- mvnd 官方暂未支持默认读取
MAVEN_OPTS
环境变量,如果要使用此环境变量,可以使用命令mvn clean package $MAVEN_OPTS
临时解决