Какова цель файлов mvnw и mvnw.cmd?

257

Когда я создавал приложение Spring Boot, я мог видеть mvnwи mvnw.cmdфайлы в корне проекта. Какова цель этих двух файлов?

shaunthomas999
источник

Ответы:

345

Эти файлы из оболочки Maven . Он работает аналогично оболочке Gradle .

Это позволяет запускать проект Maven без установки и представления Maven на пути. Он загружает правильную версию Maven, если он не найден (насколько я знаю по умолчанию в вашем домашнем каталоге пользователя).

mvnwФайл для Linux (Баш) и mvnw.cmdдля окружающей среды Windows.


Для создания или обновления всех необходимых файлов Maven Wrapper выполните следующую команду:

mvn -N io.takari:maven:wrapper

Чтобы использовать другую версию maven, вы можете указать версию следующим образом:

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

Обе команды требуют включения maven PATH(добавьте путь к maven binдля Pathсистемных переменных), если в вашем проекте уже есть mvnw, который вы можете использовать ./mvnwвместо mvnкоманд.

изворачиваться
источник
Ваш ответ очень полезен. Я проверяю документацию maven-оболочки. Я использовал mvnкоманду для работы Maven, хотя я мог использовать ./mvnwдля той же цели.
shaunthomas999
2
Спасибо за ответ. Можете ли вы объяснить, когда это генерируется, например, когда вы изначально создаете проект? Будет ли он обновляться по ходу процесса, когда вы будете вносить изменения в свой pom, такие как add remove зависимости / плагины?
Асанке
1
и следует ли добавить / зафиксировать файлы mvnw.cmd?
jpganz18
Ну конечно; естественно. это позволяет вам быстро запустить сборку maven без необходимости дополнительной установки maven или ее установки в PATH.
Dodge
1
Большое спасибо за ответ, это очень полезно. Не могли бы вы рассказать нам что-нибудь о переносимости файлов настроек maven, когда мы работаем таким образом? Салудос и еще раз спасибо.
Даниэль Эрнандес,
26

Команда mvnwиспользует Maven, который по умолчанию загружается ~/.m2/wrapperпри первом использовании.

URL с Maven указывается в каждом проекте по адресу .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

Чтобы обновить или изменить версию Maven, выполните следующие действия (не забывайте о --non-recursiveмногомодульных проектах):

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

или просто измените .mvn/wrapper/maven-wrapper.propertiesвручную.

Чтобы создать оболочку с нуля с помощью Maven (она должна быть PATHзапущена:

mvn io.takari:maven:wrapper -Dmaven=3.3.9 
Михал Кордас
источник
5

Maven Wrapper является отличным выбором для проектов , которые нуждаются в конкретной версии Maven (или для пользователей , которые не хотят , чтобы установить Maven на всех). Вместо того, чтобы устанавливать многие его версии в операционной системе, мы можем просто использовать специфический для проекта скрипт-обертку.

mvnw: это исполняемый скрипт оболочки Unix, используемый вместо полностью установленного Maven

mvnw.cmd : это для среды Windows


Случаи использования

Оболочка должна работать с различными операционными системами, такими как:

  • Linux
  • OSX
  • Windows
  • Solaris

После этого мы можем выполнить наши цели для системы Unix следующим образом:

./mvnw clean install

И следующая команда для Batch:

./mvnw.cmd clean install

Если в свойствах оболочки нет указанного Maven, он будет загружен и установлен в папку $USER_HOME/.m2/wrapper/distsсистемы.


Плагин Maven Wrapper

Плагин Maven Wrapper для автоматической установки в простом проекте Spring Boot.

Сначала нам нужно зайти в главную папку проекта и запустить эту команду:

mvn -N io.takari:maven:wrapper

Мы также можем указать версию Maven:

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

Опция -N означает –non-recursive, так что оболочка будет применяться только к основному проекту текущего каталога, а не к каким-либо подмодулям.

Патель Ромил
источник
2

Безусловно, лучшим вариантом в настоящее время является использование контейнера maven в качестве инструмента для сборки. Такой mvn.shсценарий будет достаточно:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"
Андре
источник
7
Это не отвечает на вопрос ОП, а просто предлагает альтернативу
ахмеджаад
2
Основная идея maven wrapper - объявить правильную версию maven для этого проекта. И бонус избегает необходимости вручную устанавливать Maven. Ваш подход не только не решает проблему с версией, но требует еще одного локально установленного инструмента.
Макс
2
Также обратите внимание, что это монтирует собственный локальный репозиторий Maven в экземпляр докера. Обычно это выполняется от имени пользователя root, поэтому все, что написано экземпляром dockerized maven, принадлежит пользователю root под Linux. Это не обязательно желательно. Я обнаружил, что правильно настроенный экземпляр Nexus, доступный для экземпляра сборки Docker, был менее болезненным, особенно если вы хотите воспроизводимые сборки.
Турбьёрн Равн Андерсен
Это было давно, но я все еще предпочитаю этот путь. Что касается Maven-версии, теги изображений предоставляют ее (просто посмотрите на страницу Maven в Docker Hub). Что касается владения root, это просто не происходит на рабочем столе докера, но на самом деле происходит в Linux-блоках (и, конечно, в сборке узлов). Небольшая хитрость может «форсировать» текущий UID в этом случае (аргумент -u), поэтому проблема решена. Но все-таки я нахожу этот подход на порядок лучше. В любом случае Docker вездесущ, особенно на узлах сборки.
Андре
1
(продолжение) Старая школа Дженкинса и мышление ведут к такого рода вещам. Современные инструменты CI / CD делают наоборот: вы просто выбираете сборочный контейнер. Но это только мое мнение.
Андре