mvnd
- Maven 守护进程mvnd
mvnd
特定选项mvnd
mvnd
mvnd
该项目旨在使用 Gradle 和 Takari 已知的技术提供更快的 Maven 构建。
架构概述:
mvnd
嵌入了 Maven(因此无需单独安装 Maven)。
实际的构建发生在一个长期存在的后台进程(也称为守护进程)内。
一个守护进程实例可以服务来自mvnd
客户端的多个连续请求。
mvnd
客户端是使用 GraalVM 构建的本机可执行文件。与启动传统 JVM 相比,它启动速度更快并且使用更少的内存。
如果没有空闲守护进程来服务构建请求,则可以并行生成多个守护进程。
该架构带来以下优点:
用于运行实际构建的 JVM 不需要为每个构建重新启动。
保存 Maven 插件类的类加载器在多个构建中进行缓存。因此,插件 jar 只被读取和解析一次。 Maven 插件的 SNAPSHOT 版本不会被缓存。
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!支持您的操作系统,就像这样简单
sdk install mvnd
如果您过去使用过手动安装,请确保~/.m2/mvnd.properties
中的设置仍然有意义。使用 SDKMAN!,通常根本不需要~/.m2/mvnd.properties
文件,因为JAVA_HOME
和MVND_HOME
都是由 SDKMAN! 管理的。
brew install mvndaemon/homebrew-mvnd/mvnd
注意:有两个公式:安装最新版本的mvnd
和安装 1.x 行的mvnd@1
。
sudo port install mvnd
我们正在寻求捐款来支持 Chocolatey、Scoop 或 asdf。如果您想帮助我们……
或者,您可以按如下方式设置完成:
# 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
或者,您可以创建~/.m2/mvnd.properties
并设置java.home
属性,以防您不想设置JAVA_HOME
环境变量。
测试mvnd
是否有效:
$ mvnd --version
Maven Daemon 0.0.11-linux-amd64 (native)
Terminal: org.jline.terminal.impl.PosixSysTerminal with pty org.jline.terminal.impl.jansi.osx.OsXNativePty
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /home/ppalaga/orgs/mvnd/mvnd/daemon/target/maven-distro
Java version: 11.0.1, vendor: AdoptOpenJDK, runtime: /home/data/jvm/adopt-openjdk/jdk-11.0.1+13
Default locale: en_IE, platform encoding: UTF-8
OS name: " linux " , version: " 5.6.13-200.fc31.x86_64 " , arch: " amd64 " , family: " unix "
如果您使用的是 Windows 并看到一条消息指出VCRUNTIME140.dll was not found
,则需要从 https://support.microsoft.com/en-us/help/2977003/the-latest-supported 安装vc_redist.x64.exe
-视觉-C-下载。有关更多信息,请参阅 oracle/graal#1762。
如果您使用的是 macOS,则需要在解压存档后从所有文件中删除隔离标志:
$ xattr -r -d com.apple.quarantine mvnd-xyz-darwin-amd64
mvnd
旨在接受与 stock 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 扩展列表
有关可用属性的完整列表,请参阅 /dist/src/main/distro/conf/mvnd.properties。
mvnd
git
梅文
从 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
需要以下先决条件:具有工作负载“使用 C++ 进行桌面开发”的 Visual Studio 版本和单个组件“Windows Universal CRT SDK”。
mvnd
$ cp -R dist/target/mvnd-[version] [target-dir]
然后您只需将[target-dir]/bin
添加到您的PATH
并运行mvnd
即可。
我们很高兴改进mvnd
,因此非常欢迎提供反馈!