mvnw简介
# 一、前言
在阅读shardingsphere
源码过程中,出现编译错误,查阅官方文档,需要执行下面的命令
./mvnw -DskipITs -DskipTests clean install -T1C
#更快速的方式
./mvnw clean install -Prelease -T1C -DskipTests -Djacoco.skip=true -Dcheckstyle.skip=true -Drat.skip=true -Dmaven.javadoc.skip=true -B
2
3
它有什么用呢?它和mvn
有什么区别呢?本文将会介绍mvnw
的相关知识
# 二、什么是 Maven Wrapper
mvnw
全名是Maven Wrapper
, 它的原理是在maven-wrapper.properties
文件中记录你要使用的maven版本,用你期望的版本来执行mvn命令
#查看版本
$ ./mvnw --version
Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)
Maven home: C:\Users\yuanyue\.m2\wrapper\dists\apache-maven-3.8.7-bin\1ktonn2lleg549uah6ngl1r74r\apache-maven-3.8.7
Java version: 11.0.19, vendor: Oracle Corporation, runtime: D:\software\Java\jdk-11
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
2
3
4
5
6
7
Maven Wrapper 官网 (opens new window)
# 三、Maven Wrapper 使用场景
设想一下,如果所在的团队同时维护多个项目,不同的项目使用的 JDK 版本不相同,使用的 Maven 版本也不相同,那么为了支持多项目开发,为了构建运行效果一致,你可能需要在本地管理多个 Maven 版本,这会非常繁琐,而 Maven Wrapper 可以轻松的解决这个问题。
Maven Wrapper 的引入解决了下面几个问题:
- 版本一致性:通过在
mvnw
配置中指定 Maven 版本,确保所有开发人员和持续集成环境使用相同的 Maven 版本。 - 简化设置:新团队成员或 CI 环境不需要预先安装 Maven,直接运行
mvnw
命令就如安装了mvn
一样,从而简化了项目的初始设置和配置。 - 跨平台:Wrapper 是跨平台的,无论是在 Windows 还是在 Unix-like 系统上,都可以以相同的方式执行。
使用 Maven Wrapper 的好处简单的说,可以是 “如果想要使用不同的 Maven 版本进行项目构建,只需在项目中存放一个脚本文件,而不是在本地安装不同的 Maven 版本”。
# 四、如何使用 Maven Wrapper
在项目目录下执行如下命令:
mvn -N wrapper:wrapper
#或也可以指定 maven 版本
mvn -N wrapper:wrapper -Dmaven=3.8.7
2
3
4
选项
-N
参数表示非递归,因此 Maven Wrapper 只会在项目的当前目录生成,如果项目中有子模块,那么则不会作用到子模块中。
生成的目录结构
├── .mvn -> 关注
│ └── wrapper
│ ├── maven-wrapper.jar -> 关注
│ └── maven-wrapper.properties -> 关注
├── mvnw -> linux 命令文件
├── mvnw.cmd -> windows 命令文件
2
3
4
5
6
生成的文件说明
mvnw
和mvnw.cmd
脚本,分别用于 Unix/Linux 和 Windows 环境。mavenwrapper.jar
是 Maven Wrapper 运行时所需的 Jar 文件。maven-wrapper.properties
是配置文件,可以配置 Maven 版本,内容如下distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
1
2
查看版本
$ ./mvnw --version
Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)
Maven home: C:\Users\yuanyue\.m2\wrapper\dists\apache-maven-3.8.7-bin\1ktonn2lleg549uah6ngl1r74r\apache-maven-3.8.7
Java version: 11.0.19, vendor: Oracle Corporation, runtime: D:\software\Java\jdk-11
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
2
3
4
5
6
# 五、FAQ
# 5.1、执行mvnw
命令时,发现控制台输出日志中,都是从maven中央仓库拉取依赖,而不是本地仓库?
问题原因
mvnw
它使用的是maven-wrapper.properties
中指定版本的maven
用于构建项目 , 如果更改了默认仓库地址${user.home}/.m2/repository
,则会使用该版本的settings.xml
配置文件,当我们执行./mvnw --version
命令,可以看到指定的maven
所在的目录
$ ./mvnw --version
Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)
Maven home: C:\Users\yuanyue\.m2\wrapper\dists\apache-maven-3.8.7-bin\1ktonn2lleg549uah6ngl1r74r\apache-maven-3.8.7
Java version: 11.0.19, vendor: Oracle Corporation, runtime: D:\software\Java\jdk-11
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
2
3
4
5
6
解决方法
方法一:
使用默认仓库地址
方法二:
替换文件apache-maven-3.8.7\conf\settings.xml
中的配置,换成自己使用的仓库地址即可
参考: