mvnd
— демон Maven mvnd
mvnd
mvnd
из исходного кодаmvnd
mvnd
Этот проект направлен на обеспечение более быстрой сборки Maven с использованием методов, известных из Gradle и Takari.
Обзор архитектуры:
mvnd
включает Maven (поэтому нет необходимости устанавливать Maven отдельно).
Фактические сборки происходят внутри долгоживущего фонового процесса, известного как демон.
Один экземпляр демона может обслуживать несколько последовательных запросов от клиента mvnd
.
Клиент mvnd
— это собственный исполняемый файл, созданный с использованием GraalVM. Он запускается быстрее и использует меньше памяти по сравнению с запуском традиционной JVM.
Несколько демонов могут быть созданы параллельно, если нет простоя демона, который бы обслуживал запрос на сборку.
Эта архитектура дает следующие преимущества:
JVM для запуска реальных сборок не нужно начинать заново для каждой сборки.
Загрузчики классов, содержащие классы плагинов Maven, кэшируются в нескольких сборках. Таким образом, jar-файлы плагинов читаются и анализируются только один раз. SNAPSHOT-версии плагинов Maven не кэшируются.
Собственный код, созданный JIT-компилятором внутри JVM, также сохраняется. По сравнению со стандартным Maven, JIT-компиляция занимает меньше времени. Во время повторных сборок код, оптимизированный для JIT, доступен сразу. Это относится не только к коду, поступающему из плагинов Maven и Maven Core, но также ко всему коду, поступающему из самого JDK.
mvnd
предлагает следующие функции поверх стандартного Maven:
По умолчанию mvnd
собирает ваши модули параллельно, используя несколько ядер ЦП. Количество используемых ядер определяется по формуле Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)
. Если ваше дерево исходного кода не поддерживает параллельные сборки, передайте -T1
в командную строку, чтобы сделать вашу сборку последовательной.
Улучшен вывод на консоль: мы считаем, что за выводом параллельной сборки на стандартном Maven сложно следить. Поэтому мы реализовали упрощенное нескользящее представление, показывающее состояние каждого потока сборки в отдельной строке. Вот как это выглядит на машине с 24 ядрами:
После завершения сборки полный вывод Maven пересылается на консоль.
mvnd
Если СДКМАН! поддерживает вашу операционную систему, это так же просто, как
sdk install mvnd
Если вы раньше использовали ручную установку, убедитесь, что настройки в ~/.m2/mvnd.properties
по-прежнему имеют смысл. При использовании SDKMAN! файл ~/.m2/mvnd.properties
обычно вообще не нужен, поскольку и JAVA_HOME
, и MVND_HOME
управляются SDKMAN!.
brew install mvndaemon/homebrew-mvnd/mvnd
Примечание. Существует две формулы: mvnd
, которая устанавливает последнюю версию, и mvnd@1
, которая устанавливает строку 1.x.
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
— единственная поддерживаемая на данный момент оболочка.
Загрузите последнюю версию ZIP-файла, подходящую для вашей платформы, с https://downloads.apache.org/maven/mvnd/.
Разархивируйте в каталог по вашему выбору
Добавьте каталог 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
, вам необходимо установить vc_redist.x64.exe
с https://support.microsoft.com/en-us/help/2977003/the-latest-supported. -visual-c-загрузки. См. oracle/graal#1762 для получения дополнительной информации.
Если вы используете macOS, после распаковки архива вам необходимо снять пометки карантина со всех файлов:
$ xattr -r -d com.apple.quarantine mvnd-xyz-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 для регистрации.
Полный список доступных свойств см. в /dist/src/main/distro/conf/mvnd.properties.
mvnd
из исходного кода git
Мавен
Загрузите и распакуйте GraalVM CE с GitHub.
Установите 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 Universal CRT SDK».
mvnd
$ cp -R dist/target/mvnd-[version] [target-dir]
Затем вы можете просто добавить [target-dir]/bin
в свой PATH
и запустить mvnd
.
Мы рады улучшить mvnd
, поэтому обратная связь приветствуется!