概述
Maven Wrapper,缩写为mvnw
,是一个受Gradle Wrapper和Takari Wrapper启发而产生的Maven子项目,主要有以下三个用途:
- 让开发者电脑上无需安装Maven,也不用配置环境变量,即可使用Maven构建项目;
- 团队开发时,可让每个开发人员都保持一致的Maven版本;
- 极个别情况下,某些特殊项目,必须使用某个指定的Maven版本;其他项目使用安装配置指定的Maven版本,不互相干扰。
另外还有一款mvnd
工具和命令行,参考比Maven快2~10倍的编译工具mvnd简介与实战。
安装
安装Maven Wrapper最简单的方式是在项目(注意,可以不是Maven项目,跟Maven Wrapper版本号有关,至少需要是3.3.0;下面截图可看到并没有pom.xml
文件)的根目录下运行安装命令mvn wrapper:wrapper
:
两个mvnw
脚本文件的日期都是2024年5月21日,是Maven Wrapper 3.3.2版本的发布日期。
默认使用最新版本的Maven Wrapper,当前最新版是3.3.2
。
另外Maven Wrapper默认下载配置好的Maven,也就是mvn -v
命令依赖的版本:
如果想指定Maven版本,则追加版本号,即使用命令mvn wrapper:wrapper -Dmaven=3.9.9
指定下载3.9.9
版本。
另,Maven马上迎来4这个大版本,拭目以待吧。
根据Maven Wrapper版本的不同,会在当前目录下生成3或4个文件:
.mvn\wrapper\maven-wrapper.jar
:.mvn\wrapper
隐藏目录下的JAR包,没有显式告知版本号。通过JD-GUI等反编译工具当然可以查找到版本号。3.3.2版本(自什么版本开始,暂时未知)的Maven Wrapper不再生成此文件(下文有原因分析)。.mvn\wrapper\maven-wrapper.properties
:配置文件,内容如下,据此可知使用的Maven和Maven Wrapper版本,可解答上面的问题。注:Maven Wrapper有些版本此文件只有一个distributionUrl,无法一眼看出Wrapper版本,这是Takari Maven Wrapper。
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
另外,如果不再生成JAR包,则maven-wrapper.properties
配置文件也会不一样:
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
mvnw
:用于Linux、Mac等系统的脚本;mvnw.cmd
:用于Windows系统的脚本;
下载安装
因为执行mvn wrapper:wrapper
命令安装Maven Wrapper需提前下载并配置好Maven。如果开发者电脑里没有Maven,咋办呢。
参考stackoverflow,从这里选择一个版本,推荐最新版。一般直接下载第一个文件即可,形如maven-wrapper-distribution-x.x.x-bin.zip
的压缩文件。解压缩,然后手动添加.mvn/wrapper/maven-wrapper.properties
配置文件并指定想要使用的Maven版本(参考上文);提交到Git Server前,最好删除压缩包里的JAR文件。
确实有点麻烦。
Takari
上面提到JD-GUI可反编译maven-wrapper.jar
文件。值得注意的是,除了Apache Maven Wrapper外,还有个Takari Maven Wrapper:
上面截图,Takari Maven Wrapper使用的包路径是apache。
在Maven仓库里搜索,最后一个GAV如下:
<dependency>
<groupId>io.takari</groupId>
<artifactId>maven-wrapper</artifactId>
<version>0.5.6</version>
</dependency>
时间停留在2019年12月4日。
这两者的关系是:Maven Wrapper,最初由Takari团队开发。后来这个工具被广泛采纳和使用,成为Maven官方推荐的工具。因此之前的GAV不再发布新版本,最新的GAV如下:
<dependency>
<groupId>org.apache.maven.wrapper</groupId>
<artifactId>maven-wrapper</artifactId>
<version>3.3.2</version>
</dependency>
版本号和上面提到的3.3.2对应得上。
版本控制系统
可能有些朋友会有疑问,使用Maven Wrapper无需下载安装Maven,更无需配置环境变量,但上面却使用mvn wrapper:wrapper
命令来安装Maven Wrapper,mvn
命令的使用不是得提前安装并配置Maven么。
是不是有种鸡生蛋,还是蛋生鸡的既视感?
实际上,执行mvn wrapper:wrapper
命令生成的几个文件,是需要一并提交到Git版本管理系统里。也就是说,从GitHub或GitLab上clone下来的某个项目。如果有这几个文件,则不管你是否安装并配置过Maven,都会使用此项目指定的Maven版本,也就是Maven Wrapper通过配置文件maven-wrapper.properties
指定的版本:
从截图可知,默认在C盘用户目录下安装zip文件并解压,然后设置MAVEN_HOME
指向解压缩后的目录。另外,最新版Maven Wrapper,即3.3.2版本会删除压缩包,毕竟留着也没用。
反过来,正是因为这几个文件需要提交到Git Server,如Maven Wrapper早期版本会生成JAR包,此文件说大不大,说小也并不小,40~50k左右。
Git版本管理系统有一个最佳实践是:提交代码、配置等文本文件,尽可能不要提交图片、JAR包等二进制文件。
有些朋友可能会说,就那么50k,也没有什么大碍吧。编码洁癖强迫症,像我就是,真受不了。
或者,有其他朋友会说,这些二进制文件并不会更