当前位置: 首页 > 工具软件 > Maven Wrapper > 使用案例 >

Maven Wrapper(mvnw)

司寇望
2023-12-01

Maven Wrapper(mvnw)

Maven Wrapper

Maven Wrapper是一个Maven插件,用于封装提供Maven项目构建时所需要的一切。这么说可能比较抽象,来举个具体的例子吧。

一个Maven项目由多人协作维护,某天一个Geek在构建时使用了最新版本的Maven特性,然后push了依赖该特性的相关代码,然后连锁反应开始了。其他维护者们机器上安装的Maven版本过低导致构建不通过,于是维护者们需要集体升级Maven版本。想象一下,如果这个项目的维护者多达上百人,这是一个多么招人憎恨的事。

使用 Maven Wrapper 就可以很好的保证所有项目参与者都使用相同的Maven版本,同时还不会影响其他项目。Maven Wrapper官方称it's a great idea borrowed from Gradle

Wrapper基础用法及原理#

在项目中添加 mvnw(Maven Wrapper,下文都用mvnw指代Maven Wrapper) 非常简单,只需一条命令:

mvn -N io.takari:maven:wrapper

在一个全新的空项目中执行上述命令,项目中生成以下目录/文件:

$ tree -ar
.
|-- mvnw.cmd
|-- mvnw
|-- .mvn
|   `-- wrapper
|       |-- maven-wrapper.properties
|       |-- maven-wrapper.jar
|       `-- MavenWrapperDownloader.java

mvnw.cmd & mvnw#

maven wrapper shell scripts,没使用mvnw前我们构建命令通常如下:

$ mvn clean install

使用 mvnw 后,构建命令为:

$ ./mvnw clean install

在Windows系统上时则使用如下命令:

$ mvnw.cmd clean install

.mvn/wrapper/maven-wrapper.properties#

从文件格式上就可以看出这是一个配置文件,再来看看里面的内容:

distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.3/maven-wrapper-0.5.3.jar

key-value的命名和值已经将他们的功能体系的非常明显了:

  • distributionUrl-指定Maven下载地址
  • wrapperUrl-指定maven-wrapper.jar的下载地址

.mvn/wrapper/maven-wrapper.jar#

maven wrapper shell scripts 通过调用 maven-wrapper.jar根据.mvn/wrapper/maven-wrapper.properties中的distributionUrl 来下载指定的Maven版本以及执行后续功能调用。

./mvn/wrapper/MavenWrapperDownloader.java#

假如你的工程规范中不允许直接在项目中添加jar文件(例如提交审查软件检测到.jar会直接拒绝commit),此时你只能通过版本控制软件排除掉对.mvn/wrapper/maven-wrapper.jar的checkin/commit,那新人clone工程的时候怎么办,难道要手动copymaven-wrapper.jar吗?

别担心,mvnw已经考虑了这种情况。在执行./mvnw 或 mvnw.cmd时,如果脚本找不到.mvn/wrapper/maven-wrapper.jar,就会自动根据.mvn/wrapper/maven-wrapper.properties中的wrapperUrl下载maven-wrapper.jar

maven-wrapper.jar的下载会优先调用系统的curlwget命令来执行,假如这两个命令都没有的话,作为最后的兜底手段,会编译并运行 ./mvn/wrapper/MavenWrapperDownloader.java 来完成下载。

指定Wrapper使用的Maven版本#

我们可以通过加上-Dmaven参数来指定wrapper使用的Maven版本,例如我们需要maven 3.3.3版本:

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

项目中.mvn/wrapper/maven-wrapper.properties文件的distributionUrl会指向Maven 3.3.3:

distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.3.3/apache-maven-3.3.3-bin.zip

更多用法参考官方GitHub#

Maven Wrapper Github

相关阅读

相关文章

相关问答