前言
使用下面的命令编译我们公司的后端项目,编译时长达到了1个多小时,这要是上线,不得把人急死,得优化一下,查询了一些资料,结论如下。
# 原始的命令
mvn clean package -Dmaven.test.skip=true
# 优化后的命令, 把$moduleName使用相对路径的pom文件,多个文件用英文逗号分开,进行编译
mvn clean package -T 32 -Dmaven.test.skip=true -am -pl $moduleName
后端代码编译
流水线中代码编译慢解决
开启多线程
mvnd clean package -T 12 -Dmaven.compile.fork=true
- -Dmaven.compile.fork=true 表示开启多线程
- -T 1c 表示利用多线程,一核一线程
- -T 4 是直接指定4线程
-T 1C 表示CPU线程的倍数 - 就是假设,现在现在1个物理CPU,有4个核心,8个线程。
那么此时-T 1C 就是8线程
只构建指定模块
mvn clean package -pl $moduleName -am
- -pl - makes Maven build only specified modules and not the whole project.
- -am - 使Maven找出目标模块所依赖的模块并进行构建
因为有一些模块其实用不上,所以这个命令的用途还是不错的。$moduleName使用相对路径的pom文件,进行编译
跳过测试代码
# mvn package进行编译、打包时, Maven会执行src/test/java中的JUnit测试用例,
# -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
# -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类
#增加跳过测试代码的编译命令,所以为了提升编译速度,可以增加以下命令
mvn clean package -Dmaven.test.skip=true
限制联网
如果本地编译没有引入新的包或者更新,可以将maven设置脱机模式
--offline
因为这个是在流水线执行,所以需要联网,指不定啥时候给我加一个上来,这个没啥用
mvnd
特点
-
嵌入 Maven (所以不需要单独安装 Maven);
maven 过渡到 maven-mvnd
的过程中实现无缝切换
!所以不需要再安装maven或进行复杂的配置更改。 -
使用 GraalVM 构建的本地可执行文件。与传统的 JVM 相比,它启动更快,使用的内存更少。
安装
github地址:https://github.com/apache/maven-mvnd
下载地址:https://github.com/apache/maven-mvnd/releases
- 下载对应的zip包,
- 配置环境变量
- 使用mvnd -version进行验证是否安装成功
C:\Users\HaC> mvnd -v
mvnd native client 0.7.1-windows-amd64 (97c587c11383a67b5bd0ff8388bd94c694b91c1e)
Terminal: org.jline.terminal.impl.jansi.win.JansiWinSysTerminal
Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
Maven home: E:\apache-mvnd-0.7.1-windows-amd64\mvn
Java version: 1.8.0_131, vendor: Oracle Corporation, runtime: E:\JDK1.8\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
常用命令
# 编译命令和mvn一样,把mvn换为mvnd就行
mvnd clean package
# 使用过程中碰见了端口占用
mvnd --stop
结论
和mvn开启多线程对比后,感觉差别不是太大,也就没有花时间在往下看,继续用mvn命令也算,时间过去了一周,也就没有截图了…
帮助文档查看
mvnd --help
总结
到生产系统尝试之后发现,和机器性能也有一定的关系。本地可能要用个15分钟完成的事情,生产系统用了3-4分钟。不管咋说吧,本次的优化也用了一定的时间,要有自己的一个文档输出鸭,坚持鸭