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?

shaunthomas999
źródło

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ń.

Unik
źródło
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 
Michał Kordas
źródło
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.

Patel Romil
źródło
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 "$@"
André
źródło
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é