Do czego służą pliki mvnw i mvnw.cmd?


257

Kiedy utworzyłem aplikację Spring Boot, mogłem zobaczyć mvnwi mvnw.cmdpliki w katalogu głównym projektu. Jaki jest cel tych dwóch plików?

Odpowiedzi:


345

Te pliki pochodzą z opakowania Maven . Działa podobnie do owijarki Gradle .

Umożliwia to uruchomienie projektu Maven bez konieczności instalacji i obecności Maven na ścieżce. Pobiera poprawną wersję Maven, jeśli nie została znaleziona (o ile domyślnie wiem w katalogu osobistym użytkownika).

mvnwPlik jest dla Linux (bash) i mvnw.cmdjest dla środowiska Windows.


Aby utworzyć lub zaktualizować wszystkie niezbędne pliki Maven Wrapper, wykonaj następujące polecenie:

mvn -N io.takari:maven:wrapper

Aby użyć innej wersji maven, możesz określić wersję w następujący sposób:

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

Oba polecenia wymagają włączenia maven PATH(dodaj ścieżkę do maven bindo PathZmiennych systemowych), jeśli masz już mvnw w swoim projekcie, którego możesz użyć ./mvnwzamiast mvnpoleceń.


Twoja odpowiedź jest bardzo pomocna. Sprawdzam dokumentację opakowania maven. I był przy użyciu mvnpolecenia dla Maven operacji chociaż mogę użyć ./mvnwdo tego samego celu.
— shaunthomas999

2
Dziękuję za odpowiedź. Czy potrafisz wyjaśnić, kiedy to zostanie wygenerowane, tak jak to jest podczas początkowego tworzenia projektu? Czy będzie aktualizowany wzdłuż linii, gdy wprowadzasz zmiany w pom, takie jak dodawanie zależności zależnych / wtyczek?
— Asanke

1
i czy należy dodać / zatwierdzić pliki mvnw.cmd?
— jpganz18

tak oczywiście. pozwala na szybkie uruchomienie kompilacji maven bez potrzeby dodatkowej instalacji maven lub posiadania go na PATH.
— Dodge

1
Bardzo dziękuję za odpowiedź, jest bardzo pomocna. Czy możesz nam powiedzieć coś na temat przenośności plików ustawień maven, gdy pracujemy w ten sposób? Saludos i jeszcze raz dziękuję.
— Daniel Hernández

26

Polecenie mvnwużywa Maven, który jest domyślnie pobierany ~/.m2/wrapperprzy pierwszym użyciu.

Adres URL z Maven jest określony w każdym projekcie na .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

Aby zaktualizować lub zmienić wersję Maven, wywołaj następujące (pamiętaj o --non-recursiveprojektach wielomodułowych):

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

lub po prostu zmodyfikuj .mvn/wrapper/maven-wrapper.propertiesręcznie.

Aby wygenerować opakowanie od zera za pomocą Maven (musisz mieć to już PATHuruchomione:

mvn io.takari:maven:wrapper -Dmaven=3.3.9 

5

Maven Wrapper jest doskonałym wyborem dla projektów, które wymagają specyficznej wersji Maven (lub dla użytkowników, którzy nie chcą się zainstalować Maven w ogóle). Zamiast instalować wiele jego wersji w systemie operacyjnym, możemy po prostu użyć skryptu opakowania specyficznego dla projektu.

mvnw: jest wykonywalnym skryptem powłoki Uniksa używanym zamiast w pełni zainstalowanego Maven

mvnw.cmd : dotyczy środowiska Windows


Przypadków użycia

Opakowanie powinno współpracować z różnymi systemami operacyjnymi, takimi jak:

  • Linux
  • OSX
  • Windows
  • Solaris

Następnie możemy uruchomić nasze cele w następujący sposób dla systemu Unix:

./mvnw clean install

Oraz następujące polecenie dla partii:

./mvnw.cmd clean install

Jeśli nie mamy określonego Maven we właściwościach opakowania, zostanie on pobrany i zainstalowany w folderze $USER_HOME/.m2/wrapper/distssystemu.


Wtyczka Maven Wrapper

Wtyczka Maven Wrapper do automatycznej instalacji w prostym projekcie Spring Boot.

Najpierw musimy przejść do głównego folderu projektu i uruchomić następującą komendę:

mvn -N io.takari:maven:wrapper

Możemy również określić wersję Maven:

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

Opcja -N oznacza –nierekurencyjny, dzięki czemu opakowanie zostanie zastosowane tylko do głównego projektu bieżącego katalogu, a nie do żadnych podmodułów.


2

Zdecydowanie najlepszą opcją byłoby użycie kontenera maven jako narzędzia do budowania. Wystarczy mvn.shtaki skrypt:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"

7
To nie odpowiada na pytanie PO, po prostu sugeruje alternatywę
— ahmedjaad

2
Podstawową ideą otoki maven jest zadeklarowanie poprawnej wersji maven dla tego projektu. Dodatkową zaletą jest uniknięcie konieczności ręcznego instalowania maven. Twoje podejście nie tylko nie rozwiązuje problemu z wersją, ale wymaga jeszcze jednego narzędzia zainstalowanego lokalnie.
— Maks.

2
Należy również pamiętać, że to instaluje własne lokalne repozytorium Maven w instancji dokera. Zwykle działa to jako root, więc wszystko, co napisane przez zadokowaną instancję maven, jest własnością root w Linuksie. To niekoniecznie jest pożądane. Zauważyłem, że poprawnie skonfigurowana instancja nexusa dostępna dla instancji kompilacji dokera była mniej bolesna, szczególnie jeśli chcesz odtwarzalnych kompilacji.
— Thorbjørn Ravn Andersen

To było dawno temu, ale nadal wolę tę drogę. O wersji maven zapewniają ją tagi graficzne (wystarczy spojrzeć na stronę maven w Docker Hub). Jeśli chodzi o własność roota, po prostu nie dzieje się to na pulpicie dokera - ale faktycznie dzieje się to w pudełkach z linuksem (i oczywiście budowanie węzłów). Mała sztuczka może w tym przypadku „wymusić” bieżący UID (argument -u), więc problem zostanie rozwiązany. Ale wszystko oznacza, że ​​uważam to podejście o rząd wielkości za lepsze. Docker i tak jest wszechobecny, szczególnie w węzłach kompilacji.
— André

1
(kontynuacja) Old-schoolowa konfiguracja Jenkins i sposób myślenia prowadzą do tego rodzaju rzeczy. Nowoczesne narzędzia CI / CD działają odwrotnie: wystarczy wybrać kontener kompilacji. Ale to tylko moja opinia.
— André
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.