介绍
该项目旨在使用Gradle和Takari已知的技术提供更快的Maven构建。
架构概述:
- mvnd嵌入了Maven(因此不需要单独安装Maven)
- 实际的构建发生在一个长时间活动的后台进程中,又名守护进程
- 一个守护进程实例可以为来自mvnd客户机的多个连续请求提供服务
- mvnd客户端是使用GraalVM构建的本机可执行文件。与启动传统JVM相比,它启动速度更快,使用的内存更少
- 如果没有空闲的守护进程来处理构建请求,可以并行地生成多个守护进程
这种架构带来以下优点:
- 用于运行实际构建的JVM不需要为每个构建重新启动
- 保存Maven插件类的类加载器在多个构建中被缓存。因此,插件jar只被读取和解析一次。快照版本的Maven插件不会被缓存
- JVM中即时(JIT)编译器生成的本机代码也会被保留。与stock Maven相比,JIT编译花费的时间更少。在重复构建期间,jit优化的代码立即可用。这不仅适用于来自Maven插件和Maven核心的代码,也适用于来自JDK本身的所有代码
附加特性
mvnd在Maven的基础上带来了以下特性:
- 默认情况下,mvnd 使用多个 CPU 核心并行构建模块。利用的核心数由公式 Math.max(Runtime.getRuntime().availableProcessors() - 1, 1) 给出。如果您的源代码树不支持并行构建,请将 -T1 传递到命令行以使构建串行化
- 改进了控制台输出:我们认为,在普通 Maven 上并行构建的输出很难理解。因此,我们实现了一个简化的非滚动视图,在单独的行上显示每个构建线程的状态。这是在具有 24 个核心的机器上的样子:
构建完成后,完整的 Maven 输出将转发到控制台。
如何安装mvnd
使用SDKMAN安装
sdk install mvnd
如果您以前使用过手动安装,请确保 ~/.m2/mvnd.properties 中的设置仍然有意义。使用 SDKMAN!,通常根本不需要 ~/.m2/mvnd.properties 文件,因为 JAVA_HOME 和 MVND_HOME 都由 SDKMAN! 管理。
使用Homebrew安装
brew install mvndaemon/homebrew-mvnd/mvnd
使用MacPorts安装
sudo port install mvnd
设置完成
(可选)您可以按以下方式设置完成:
# ensure that MVND_HOME points to your mvnd distribution, note that sdkman does it for you
echo 'source $MVND_HOME/bin/mvnd-bash-completion.bash' >> ~/.bashrc
bash是目前唯一支持的shell。
手动安装
- 从https://downloads.apache.org/maven/mvnd/下载适合您平台的最新ZIP
- 解压缩到您选择的目录
- 将bin目录添加到PATH(加入到系统环境变量中)
- 如果您不想设置JAVA_HOME环境变量,您可以选择创建~/.m2/mvnd.properties并设置java.home属性。
- 测试mvnd是否工作:
C:\Users\liu>mvnd --version
[[1;33mWARNING[m] Found old JDK, fallback to the embedded maven!
[[1;33mWARNING[m] Use JDK 11+ to run maven-mvnd client!
Apache Maven 3.9.8 (36645f6c9b5079805ea5009217e36f2cffd34256)
Maven home: E:\InstallApp\maven-mvnd-1.0.0-darwin-amd64\mvn
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: E:\InstallApp\jdk8\jdk1.8.0_191\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
如果您在 Windows 上看到未找到 VCRUNTIME140.dll 的消息,则需要从 https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads 安装 vc_redist.x64.exe。有关更多信息,请参阅 oracle/graal#1762。
如果您使用的是 macOS,则需要在解压存档后从所有文件中删除隔离标志:
xattr -r -d com.apple.quarantine mvnd-x.y.z-darwin-amd64
使用
mvnd被设计为接受与普通mvn相同的命令行选项(加上一些额外的-见下文),例如:
mvnd verify
mvnd特定选项
--status
列出正在运行的守护进程
--stop
杀死所有正在运行的守护进程
mvnd --help
打印选项的完整列表
配置
可以通过属性文件提供配置。mvnd 从以下位置读取属性文件:
- 使用MVND_PROPERTIES_PATH环境变量或mvnd.propertiesPath系统变量提供的属性路径
- 本地属性路径位于[PROJECT_HOME]/.mvn/mvnd.properties
- 用户属性路径位于:[USER_HOME]/. m2/mvnd.properties
- 系统属性路径位于:[MVND_HOME]/conf/mvnd.properties
在第一个文件中定义的特性将优先于在较低级别的文件中指定的特性。
一些特殊属性不遵循上述机制:
- mvnd.daemonStorage : 此属性定义mvnd存储其文件(注册表和守护程序日志)的位置。此属性只能在命令行上定义为系统属性
- mvnd.id : 此属性在内部用于标识正在创建的后台进程
- mvnd.extClasspath : 指定maven扩展类路径的内部选项
-
mvnd.coreExtensions : 指定要注册的maven扩展列表的内部选项
从源代码构建mvnd
前提条件:
- git
- Maven
- 从GitHub下载并解压GraalVM CE
- 将JAVA_HOME设置为您在上一步中解压缩GraalVM的位置。检查java -version输出是否符合预期:
$ $JAVA_HOME/bin/java -version
openjdk version "11.0.9" 2020-10-20
OpenJDK Runtime Environment GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06)
OpenJDK 64-Bit Server VM GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06, mixed mode, sharing)
- 安装native-image工具:
$ $JAVA_HOME/bin/gu install native-image
native-image可能需要安装其他软件,具体取决于您的平台-请参阅native-image文档。
构建mvnd
$ git clone https://github.com/apache/maven-mvnd.git
$ cd maven-mvnd
$ mvn clean verify -Pnative
...
$ cd client
$ file target/mvnd
target/mvnd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=93a554f3807550a13c986d2af9a311ef299bdc5a, for GNU/Linux 3.2.0, with debug_info, not stripped
$ ls -lh target/mvnd
-rwxrwxr-x. 1 ppalaga ppalaga 25M Jun 2 13:23 target/mvnd
请注意,如果您使用Windows作为操作系统,您将需要以下先决条件来构建maven-mvnd:Visual Studio的版本,工作负载为“使用C++进行桌面开发”和单独的组件“Windows通用CRT SDK”。
安装mvnd
$ cp -R dist/target/mvnd-[version] [target-dir]
然后你可以简单地将[target-dir]/bin添加到PATH中并运行mvnd。