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
的下载会优先调用系统的curl
或wget
命令来执行,假如这两个命令都没有的话,作为最后的兜底手段,会编译并运行 ./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
最新文章
- 【编码】_C#中编码名称(Name)与页面标识(CodePage)的关系_编码gb2312的获取
- c# 列举所有窗口和子窗口
- iOS开发——UI基础-KVO
- Ibatis 测试出SQL
- Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/dyld_sim is not owned by root.
- java中的Integer的toBinaryString()方法
- PHP中使用kindeditor
- 知识点摸清 - - position属性值之relative与absolute
- STL 之 空间配置器(allocator)
- asp.net mvc3 linq实现数据的增、删、改、查、
- java线程池分析和应用
- 深度学习开发环境搭建教程(Mac篇)
- Java学习笔记——山西煤老板蛋疼的拉车问题
- [BZOJ3293] [Cqoi2011] 分金币 (贪心)
- React-----input中的value不更新 - 提问
- 写给 Android 开发的小程序布局指南,Flex 布局!
- 音视频编解码技术(二):AAC 音频编码技术
- 【题解】 bzoj3916: [Baltic2014]friends (字符串Hash)
- 【CUDA】Windows 下常用函数头文件
- 第十九节:Java基本数据类型,循环结构与分支循环
热门文章
- 个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇
- Hadoop值Partition分区
- JS系列1---节流,去抖(防抖)应用场景:intput请求优化,页面监听
- [leetcode] 120. Triangle (Medium)
- PHP-- B/S结构
- DFS_全球变暖_蓝桥杯2018省赛N0.9
- husky+ prettier + commitlint 提交前代码检查和提交信息规范
- PHP与ECMAScript_2_数据类型
- 网站性能优化的方法--Yahoo
- 01 | 健康之路 kubernetes(k8s) 实践之路 : 开篇及概况