mvnd
- o Daemon Maven mvnd
mvnd
mvnd
a partir da fontemvnd
mvnd
Este projeto visa fornecer compilações Maven mais rápidas usando técnicas conhecidas de Gradle e Takari.
Visão geral da arquitetura:
mvnd
incorpora o Maven (portanto, não há necessidade de instalar o Maven separadamente).
As compilações reais acontecem dentro de um processo de fundo de longa duração, também conhecido como daemon.
Uma instância do daemon pode atender a várias solicitações consecutivas do cliente mvnd
.
O cliente mvnd
é um executável nativo construído usando GraalVM. Ele inicia mais rápido e usa menos memória em comparação com a inicialização de uma JVM tradicional.
Vários daemons podem ser gerados em paralelo se não houver nenhum daemon inativo para atender a uma solicitação de construção.
Essa arquitetura traz as seguintes vantagens:
A JVM para executar as construções reais não precisa ser reiniciada para cada construção.
Os carregadores de classe que contêm classes de plug-ins Maven são armazenados em cache em várias compilações. Os jars do plugin são lidos e analisados apenas uma vez. As versões SNAPSHOT dos plug-ins Maven não são armazenadas em cache.
O código nativo produzido pelo compilador Just-In-Time (JIT) dentro da JVM também é mantido. Comparado ao estoque Maven, menos tempo é gasto na compilação JIT. Durante as construções repetidas, o código otimizado para JIT fica disponível imediatamente. Isso se aplica não apenas ao código proveniente dos plug-ins do Maven e do Maven Core, mas também a todo o código proveniente do próprio JDK.
mvnd
traz os seguintes recursos além do estoque Maven:
Por padrão, mvnd
constrói seus módulos em paralelo usando vários núcleos de CPU. O número de núcleos utilizados é dado pela fórmula Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)
. Se sua árvore de origem não suportar compilações paralelas, passe -T1
na linha de comando para tornar sua compilação serial.
Saída de console aprimorada: acreditamos que a saída de uma compilação paralela no estoque Maven é difícil de acompanhar. Portanto, implementamos uma visualização não contínua simplificada que mostra o status de cada thread de construção em uma linha separada. Isto é o que parece em uma máquina com 24 núcleos:
Assim que a compilação for concluída, a saída completa do Maven será encaminhada para o console.
mvnd
Se SDKMAN! suporta seu sistema operacional, é tão fácil quanto
sdk install mvnd
Se você usou a instalação manual no passado, certifique-se de que as configurações em ~/.m2/mvnd.properties
ainda façam sentido. Com o SDKMAN!, o arquivo ~/.m2/mvnd.properties
normalmente não é necessário, porque JAVA_HOME
e MVND_HOME
são gerenciados pelo SDKMAN!.
brew install mvndaemon/homebrew-mvnd/mvnd
Nota: Existem duas fórmulas: a mvnd
que instala a linha mais recente e mvnd@1
que instala a linha 1.x.
sudo port install mvnd
Procuramos contribuições para apoiar Chocolatey, Scoop ou asdf. Se você quiser nos ajudar…
Opcionalmente, você pode configurar a conclusão da seguinte maneira:
# 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
é o único shell suportado no momento.
Baixe o ZIP mais recente adequado para sua plataforma em https://downloads.apache.org/maven/mvnd/
Descompacte em um diretório de sua preferência
Adicione o diretório bin
ao PATH
Opcionalmente, você pode criar ~/.m2/mvnd.properties
e definir a propriedade java.home
caso não queira se preocupar em definir a variável de ambiente JAVA_HOME
.
Teste se mvnd
funciona:
$ 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 "
Se você estiver no Windows e vir uma mensagem informando que VCRUNTIME140.dll was not found
, será necessário instalar vc_redist.x64.exe
em https://support.microsoft.com/en-us/help/2977003/the-latest-supported -visual-c-downloads. Consulte oracle/graal#1762 para obter mais informações.
Se você estiver no macOS, precisará remover os sinalizadores de quarentena de todos os arquivos após descompactar o arquivo:
$ xattr -r -d com.apple.quarantine mvnd-xyz-darwin-amd64
mvnd
foi projetado para aceitar as mesmas opções de linha de comando como stock mvn
(mais alguns extras - veja abaixo), por exemplo:
mvnd verify
mvnd
--status
lista daemons em execução
--stop
mata todos os daemons em execução
mvnd --help
imprime a lista completa de opções
A configuração pode ser fornecida por meio do arquivo de propriedades. Mvnd lê o arquivo de propriedades nos seguintes locais:
o caminho de propriedades fornecido usando a variável de ambiente MVND_PROPERTIES_PATH
ou a variável de sistema mvnd.propertiesPath
o caminho das propriedades locais localizado em [PROJECT_HOME]/.mvn/mvnd.properties
o caminho das propriedades do usuário localizado em: [USER_HOME]/.m2/mvnd.properties
o caminho das propriedades do sistema localizado em: [MVND_HOME]/conf/mvnd.properties
As propriedades definidas nos primeiros arquivos terão precedência sobre as propriedades especificadas em um arquivo de classificação inferior.
Algumas propriedades especiais não seguem o mecanismo acima:
mvnd.daemonStorage
: esta propriedade define o local onde o mvnd armazena seus arquivos (registro e logs do daemon). Esta propriedade só pode ser definida como uma propriedade do sistema na linha de comando
mvnd.id
: esta propriedade é usada internamente para identificar o daemon que está sendo criado
mvnd.extClasspath
: opção interna para especificar o classpath da extensão maven
mvnd.coreExtensions
: opção interna para especificar a lista de extensões maven para registrar
Para obter uma lista completa de propriedades disponíveis, consulte /dist/src/main/distro/conf/mvnd.properties.
mvnd
a partir da fonte git
Maven
Baixe e descompacte GraalVM CE do GitHub
Defina JAVA_HOME
para onde você descompactou o GraalVM na etapa anterior. Verifique se a saída java -version
está conforme o esperado:
$ $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)
Instale a ferramenta native-image
:
$ $JAVA_HOME /bin/gu install native-image
native-image
pode exigir a instalação de software adicional dependendo da sua plataforma - consulte a documentação 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
Observe que se você estiver usando o Windows como sistema operacional, precisará dos seguintes pré-requisitos para compilar maven-mvnd
: uma versão do Visual Studio com a carga de trabalho "Desenvolvimento de desktop com C++" e o componente individual "Windows Universal CRT SDK".
mvnd
$ cp -R dist/target/mvnd-[version] [target-dir]
Então você pode simplesmente adicionar [target-dir]/bin
ao seu PATH
e executar mvnd
.
Estamos felizes em melhorar mvnd
, então feedback é muito bem-vindo!