简单粗暴:maven的升级版本 mvnd
介绍
该项目旨在使用 Gradle 和 Takari 已知的技术提供更快的Maven构建。
架构概述:
-
mvnd
嵌入了Maven(所以不需要单独安装Maven)。 -
实际的构建发生在一个长期存在的后台进程中,也就是守护进程。
-
一个守护进程实例可以为来自
mvnd
客户端的多个连续请求提供服务。 -
该
mvnd
客户端是使用内置本地可执行GraalVM。与启动传统 JVM 相比,它启动速度更快,使用的内存更少。 -
如果没有空闲守护程序来处理构建请求,则可以并行生成多个守护程序。
这种架构带来了以下优势:
-
用于运行实际构建的 JVM 不需要为每个构建重新启动。
-
持有 Maven 插件类的类加载器缓存在多个构建中。因此,插件 jars 只被读取和解析一次。SNAPSHOT 版本的 Maven 插件不会被缓存。
-
JVM 中的实时 (JIT) 编译器生成的本机代码也被保留。与库存 Maven 相比,JIT 编译花费的时间更少。在重复构建期间,JIT 优化代码立即可用。这不仅适用于来自 Maven 插件和 Maven Core 的代码,也适用于来自 JDK 本身的所有代码。
附加功能
mvnd
在库存 Maven 之上带来以下功能:
-
默认情况下,
mvnd
使用多个 CPU 内核并行构建模块。使用的核心数由公式给出Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)
。如果您的源代码树不支持并行构建,请传递-T1
命令行以使您的构建串行。 -
改进的控制台输出:我们认为在股票 Maven 上并行构建的输出很难理解。因此,我们实现了一个简化的非滚动视图,在单独的行上显示每个构建线程的状态。这是在具有 24 个内核的机器上的样子:
-
构建完成后,完整的 Maven 输出将转发到控制台。
-
如何安装 mvnd
使用SDKMAN安装!
如果 SDKMAN!支持您的操作系统,就这么简单
$ sdk 安装 mvnd
如果您过去使用手动安装,请确保设置~/.m2/mvnd.properties
仍然有效。随着SDKMAN!上~/.m2/mvnd.properties
通常没有必要的文件,因为两者JAVA_HOME
并 MVND_HOME
用SDKMAN的管理!
使用Homebrew安装
$ brew install mvndaemon/homebrew-mvnd/mvnd
使用MacPorts安装
$ sudo 端口安装 mvnd
使用Chocolatey安装
$ choco 安装 mvndaemon
设置完成
或者,您可以按如下方式设置完成:
#确保将 MVND_HOME 设置为指向您的 mvnd 发行版,请注意 sdkman 会为您执行此操作 $ echo ' source $MVND_HOME/bin/mvnd-bash-completion.bash ' >> ~ /.bashrc
bash
是目前唯一支持的 shell。
oh-my-zsh 用户注意事项
使用的用户oh-my-zsh
经常使用maven的补全。默认的 maven 完成插件定义mvnd
为mvn deploy
. 因此,在能够使用之前mvnd
,您需要使用以下命令取消别名:
$ unalias mvnd
手动安装
-
从https://github.com/mvndaemon/mvnd/releases下载适合您平台的最新 ZIP
-
解压到您选择的目录
-
将
bin
目录添加到PATH
-
或者,您可以创建
~/.m2/mvnd.properties
和设置java.home
属性,以防您不想设置JAVA_HOME
环境变量。 -
测试是否
mvnd
有效:$ mvnd --version Maven 守护进程 0.0.11-linux-amd64(本机) 终端:org.jline.terminal.impl.PosixSysTerminal with pty org.jline.terminal.impl.jansi.osx.OsXNativePty Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven 主页:/home/ppalaga/orgs/mvnd/mvnd/daemon/target/maven-distro Java 版本:11.0.1,供应商:AdoptOpenJDK,运行时:/home/data/jvm/adopt-openjdk/jdk-11.0.1+13 默认语言环境:en_IE,平台编码:UTF-8 操作系统名称:“ linux ”,版本:“ 5.6.13-200.fc31.x86_64 ”,arch:“ amd64 ”,系列:“ unix ”
如果您使用的是 Windows 并看到一条消息
VCRUNTIME140.dll was not found
,您需要vc_redist.x64.exe
从Latest supported Visual C++ Redistributable downloads | Microsoft Docs进行安装 。有关更多信息,请参阅How to include msvcr100.dll in Windows native image · Issue #1762 · oracle/graal · GitHub。
用法
mvnd
旨在接受相同的命令行选项,如股票mvn
(加上一些额外的 - 见下文),例如:
mvnd 全新安装
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 扩展列表的内部选项
有关可用属性的完整列表,请参阅 /dist/src/main/distro/conf/mvnd.properties。
mvnd
从源代码构建
先决条件:
-
git
-
马文
-
从GitHub下载并解压 GraalVM CE
-
设置
JAVA_HOME
为您在上一步中解压 GraalVM 的位置。检查java -version
输出是否符合预期:$ $JAVA_HOME /bin/java -version openjdk 版本“ 11.0.9 ” 2020-10-20 OpenJDK 运行时环境 GraalVM CE 20.3.0(构建 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,混合模式,共享)
-
安装
native-image
工具:$ $JAVA_HOME /bin/gu 安装本机映像
-
native-image
根据您的平台,可能需要安装其他软件 - 请参阅 native-image文档。
建造 mvnd
$ git clone https://github.com/mvndaemon/mvnd.git $ cd mvnd $ mvn clean verify -Pnative ... $ cd客户端 $文件目标/mvnd 目标/ mvnd:ELF 64位LSB的可执行文件,X86-64,版本1(SYSV),动态链接的,解释器/lib64/ld-linux-x86-64.so.2,BuildID [SHA1] = 93a554f3807550a13c986d2af9a311ef299bdc5a,用于GNU / Linux 3.2.0,带有 debug_info,未剥离 $ ls -lh 目标/mvnd -rwxrwxr-x。1 ppalaga ppalaga 25M Jun 2 13:23 target/mvnd
安装 mvnd
$ cp -R dist/target/mvnd-[版本] [目标目录]
然后你可以简单地运行 add [target-dir]/bin
to your PATH
and run mvnd
。
参考文档: https://github.com/apache/maven-mvnd
Takari(Maven生命周期优化器): http://takari.io/book/40-lifecycle.html
maven-mvnd: https://github.com/apache/maven-mvnd
mvnd发行版仓库: https://github.com/mvndaemon/mvnd/releases
mvnd配置:https://github.com/mvndaemon/mvnd/blob/master/dist/src/main/distro/conf/mvnd.propertie