Qual é o objetivo dos arquivos mvnw e mvnw.cmd?

257

Quando criei um aplicativo Spring Boot, pude ver mvnwe mvnw.cmdarquivos na raiz do projeto. Qual é o objetivo desses dois arquivos?

shaunthomas999
fonte

Respostas:

345

Esses arquivos são do wrapper Maven . Funciona de maneira semelhante ao wrapper Gradle .

Isso permite que você execute o projeto Maven sem ter o Maven instalado e presente no caminho. Ele baixa a versão correta do Maven se não for encontrada (tanto quanto eu sei por padrão no diretório inicial do usuário).

O mvnwarquivo é para Linux (bash) e mvnw.cmdé para o ambiente Windows.


Para criar ou atualizar todos os arquivos necessários do Maven Wrapper, execute o seguinte comando:

mvn -N io.takari:maven:wrapper

Para usar uma versão diferente do maven, você pode especificar a versão da seguinte maneira:

mvn -N io.takari:maven:wrapper -Dmaven=3.3.3

Ambos os comandos exigem maven em PATH(adicionar o caminho para maven binpara Pathem Variáveis do sistema) se você já tem mvnw em seu projeto você pode usar ./mvnwem vez de mvnnos comandos.

Dodge
fonte
Sua resposta é muito útil. Verifico a documentação do invólucro maven. Eu estava usando o mvncomando para operação maven, embora pudesse usar ./mvnwpara o mesmo propósito.
Shaunthomas999
2
Obrigado pela resposta. Você pode explicar quando isso é gerado, como é quando você cria um projeto inicialmente? Será atualizado ao longo da linha quando você fizer alterações no seu pom, como adicionar remover dependências / plugins?
Asanke
1
e você deve adicionar / confirmar os arquivos mvnw.cmd?
precisa saber é o seguinte
sim, claro. Ele permite que você execute rapidamente sua compilação maven sem a necessidade de instalar extra maven ou tê-lo no PATH.
Evite
1
Muito obrigado pela resposta, é muito útil. Você poderia nos dizer algo sobre a portabilidade dos arquivos de configurações do maven quando trabalhamos dessa maneira? Saludos e obrigado novamente.
Daniel Hernández
26

O comando mvnwusa o Maven que é baixado por padrão ~/.m2/wrapperno primeiro uso.

O URL com o Maven é especificado em cada projeto em .mvn/wrapper/maven-wrapper.properties:

distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip

Para atualizar ou alterar a versão do Maven, chame o seguinte (lembre-se de --non-recursivepara projetos com vários módulos):

./mvnw io.takari:maven:wrapper -Dmaven=3.3.9 

ou apenas modificar .mvn/wrapper/maven-wrapper.properties manualmente.

Para gerar o wrapper a partir do zero usando o Maven (é necessário que ele já esteja em PATHexecução:

mvn io.takari:maven:wrapper -Dmaven=3.3.9 
Michal Kordas
fonte
5

O Maven Wrapper é uma excelente opção para projetos que precisam de uma versão específica do Maven (ou para usuários que não desejam instalar o Maven). Em vez de instalar muitas versões dele no sistema operacional, podemos apenas usar o script de wrapper específico do projeto.

mvnw: é um script shell executável do Unix usado no lugar de um Maven totalmente instalado

mvnw.cmd : é para ambiente Windows


Casos de Uso

O wrapper deve funcionar com diferentes sistemas operacionais, como:

  • Linux
  • OSX
  • janelas
  • Solaris

Depois disso, podemos executar nossos objetivos assim para o sistema Unix:

./mvnw clean install

E o seguinte comando para o lote:

./mvnw.cmd clean install

Se não tivermos o Maven especificado nas propriedades do wrapper, ele será baixado e instalado na pasta $USER_HOME/.m2/wrapper/dists do sistema.


Plugin Maven Wrapper

Plugin Maven Wrapper para fazer a instalação automática em um projeto simples do Spring Boot.

Primeiro, precisamos ir na pasta principal do projeto e executar este comando:

mvn -N io.takari:maven:wrapper

Também podemos especificar a versão do Maven:

mvn -N io.takari:maven:wrapper -Dmaven=3.5.2

A opção -N significa –non-recursive, para que o wrapper seja aplicado apenas ao projeto principal do diretório atual, não em nenhum sub-módulo.

Patel Romil
fonte
2

De longe, a melhor opção hoje em dia seria usar um contêiner de maven como ferramenta de construção. Um mvn.shscript como este seria suficiente:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"
André
fonte
7
Isso não responde à pergunta do OP, apenas sugere uma alternativa
ahmedjaad
2
A idéia muito básica do wrapper maven é declarar a versão correta do maven para este projeto. E um bônus é evitar a necessidade de instalar manualmente o maven. Sua abordagem não apenas falha na solução do problema da versão, mas requer mais uma ferramenta instalada localmente.
Max
2
Observe também que isso monta os usuários que possuem o repositório local do Maven na instância do docker. Normalmente, isso é executado como root, portanto, qualquer coisa escrita pela instância maven encaixada é de propriedade do root no Linux. Isto não é necessariamente desejável. Achei que uma instância do nexus configurada corretamente, acessível à instância de construção do Docker, era menos dolorosa, especialmente se você deseja construções reproduzíveis.
Thorbjørn Ravn Andersen
Isso foi há muito tempo, mas eu ainda prefiro assim. Sobre a versão do maven, são fornecidas por tags de imagem (basta olhar para a página do maven no Docker Hub). Quanto à propriedade raiz, isso simplesmente não acontece na área de trabalho do docker - mas, de fato, acontece nas caixas Linux (e nos nós de construção, é claro). Um pequeno truque pode "forçar" o UID atual neste caso (argumento -u), para que o problema seja resolvido. Mas todos os meios consideram essa abordagem ordens de magnitude melhores. O Docker é onipresente de qualquer maneira, especialmente nos nós de construção.
André
1
(continuação) A configuração e a mentalidade Jenkins da velha escola levam a esse tipo de coisa. As ferramentas modernas de CI / CD fazem o oposto: basta escolher um contêiner de compilação. Mas essa é apenas a minha opinião.
André