关于maven:mvnw和mvnw.cmd文件的用途是什么?

What is the purpose of mvnw and mvnw.cmd files?

当我创建一个Spring Boot应用程序时,我可以在项目的根目录中看到mvnwmvnw.cmd文件。 这两个文件的目的是什么?


这些文件来自Maven包装器。它的工作方式类似于Gradle包装器。

这使您可以运行Maven项目,而无需在路径上安装Maven和安装Maven。如果找不到正确的Maven版本,它将下载正确版本(据我所知,默认情况下位于您的用户主目录中)。

mvnw文件用于Linux(bash),而mvnw.cmd文件用于Windows环境。

要创建或更新所有必需的Maven包装器文件,请执行以下命令:

1
mvn -N io.takari:maven:wrapper

要使用其他版本的maven,可以如下指定版本:

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

这两个命令都需要在PATH上使用maven(将maven bin的路径添加到系统变量上的PATH),如果您的项目中已经有mvnw,则可以在命令中使用./mvnw而不是mvn


命令mvnw使用Maven,默认情况下,Maven在首次使用时已下载到~/.m2/wrapper

在每个项目的.mvn/wrapper/maven-wrapper.properties中指定了带有Maven的URL:

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

要更新或更改Maven版本,请调用以下命令(对于多模块项目,请记住关于--non-recursive的信息):

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

或只是手动修改.mvn/wrapper/maven-wrapper.properties

要使用Maven从头开始生成包装器(您需要在PATH中运行它:

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

对于需要特定版本的Maven的项目(或根本不想安装Maven的用户),Maven包装器是绝佳的选择。无需在操作系统中安装多个版本,只需使用特定于项目的包装器脚本即可。

mvnw:这是一个可执行的Unix shell脚本,用于代替完全安装的Maven

mvnw.cmd:适用于Windows环境

用例

包装程序应与其他操作系统配合使用,例如:

  • 的Linux
  • OSX
  • 视窗
  • 的Solaris

之后,我们可以针对Unix系统执行以下目标:

1
./mvnw clean install

并为批处理使用以下命令:

1
./mvnw.cmd clean install

如果包装属性中没有指定的Maven,则会将其下载并安装在系统的文件夹$USER_HOME/.m2/wrapper/dists中。

Maven包装器插件

Maven Wrapper插件可在一个简单的Spring Boot项目中进行自动安装。

首先,我们需要进入项目的主文件夹并运行以下命令:

1
mvn -N io.takari:maven:wrapper

我们还可以指定Maven的版本:

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

选项-N表示–non-recursive,因此包装器将仅应用于当前目录的主项目,而不应用于任何子模块。


到目前为止,最好的选择是使用Maven容器作为构建器工具。像这样的mvn.sh脚本就足够了:

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