Skip to content

使用 mvnd 加快 Maven 项目构建速度

  1. 昨天看到一篇文章,介绍 mvnd 1.0 正式发布,可以提高构建速度, 于是在自己电脑上测试了一下确实能提高不少速度。

  2. 在网上查了一下,并没有找到 mvnd 1.0 的镜像,于是自己便制作了一下镜像。

  3. 如果 package 中包含中文文件名的文件,可能存在打包异常,请执行 LANG=C.UTF-8 命令后再打包(PS. 查看字符命令 locale

仓库与代码

仓库/地址仓库类型说明
maven-mvndGitHub 仓库Apache 项目,制作镜像的源代码仓库
mvndGitHub 仓库作者仓库,使用 maven-mvnd 制作镜像的仓库源码
mvndGitee 仓库作者仓库,国内使用
mvndGitLab 仓库作者仓库,用于在国外构建镜像,提高拉取镜像、构建镜像、推送镜像的速度

测试准备

作者使用 个人自建GitLab 测试 mvnd 构建,更符合多数国内公司的使用场景

  1. 2015 年笔记本
  2. 2 核 4 线程
  3. 16G 内存,长期固定内存占用超过 9G

使用 pig 项目作为测试项目

  1. master 为 JDK 8 分支
  2. jdk17 为 JDK 17 分支
  3. 已上两个分支均测试

相关镜像列表

Docker Hub 镜像国内镜像说明
xuxiaoweicomcn/mvnd:1.0.0-dragonwell-8-anolisregistry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-8-anolis1.0.0 代表 mvnd 版本
xuxiaoweicomcn/mvnd:1.0.0-dragonwell-11-anolisregistry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-11-anolisdragonwell-8 代表使用的是阿里巴巴 JDK 8
xuxiaoweicomcn/mvnd:1.0.0-dragonwell-17-anolisregistry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mvnd:1.0.0-dragonwell-17-anolisanolis 代表是阿里云的龙蜥系统,兼容 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/CDmvn 耗时mvnd CI/CDmvnd 耗时耗时(mvnd ÷ mvn)
JDK 8jobs/130654.359 sjobs/130436.391 s66.95 %
JDK 17jobs/129841.450 sjobs/130730.033 s72.46 %

分析

  1. 无论 JDK 是 8 还是 17,速度都有不少的提升
  2. 测试耗时影响因素比较多,比如服务器的 CPU、内存 型号及当前占用率等,测试环境相对稳定,结果比较可信
  3. 使用 mvn 直接构建时,本身就不超过 1 分钟,使用 mvnd 提升效果可能看上去并不明显,如果使用 mvn 构建时间比较长,测试效果可能会更突出
  4. 由于 mvnd 的设计原理,可以重复构建效率提升更多,此处使用独立的环境,构建完成便立即销毁,所以无法测试重复构建的效率
  5. mvnd 官方暂未支持默认读取 MAVEN_OPTS 环境变量,如果要使用此环境变量,可以使用命令 mvn clean package $MAVEN_OPTS 临时解决