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已经考虑了这种情况。在执行./mvnwmvnw.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

最新文章

  1. 【编码】_C#中编码名称(Name)与页面标识(CodePage)的关系_编码gb2312的获取
  2. c# 列举所有窗口和子窗口
  3. iOS开发——UI基础-KVO
  4. Ibatis 测试出SQL
  5. Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/dyld_sim is not owned by root.
  6. java中的Integer的toBinaryString()方法
  7. PHP中使用kindeditor
  8. 知识点摸清 - - position属性值之relative与absolute
  9. STL 之 空间配置器(allocator)
  10. asp.net mvc3 linq实现数据的增、删、改、查、
  11. java线程池分析和应用
  12. 深度学习开发环境搭建教程(Mac篇)
  13. Java学习笔记——山西煤老板蛋疼的拉车问题
  14. [BZOJ3293] [Cqoi2011] 分金币 (贪心)
  15. React-----input中的value不更新 - 提问
  16. 写给 Android 开发的小程序布局指南,Flex 布局!
  17. 音视频编解码技术(二):AAC 音频编码技术
  18. 【题解】 bzoj3916: [Baltic2014]friends (字符串Hash)
  19. 【CUDA】Windows 下常用函数头文件
  20. 第十九节:Java基本数据类型,循环结构与分支循环

热门文章

  1. 个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇
  2. Hadoop值Partition分区
  3. JS系列1---节流,去抖(防抖)应用场景:intput请求优化,页面监听
  4. [leetcode] 120. Triangle (Medium)
  5. PHP-- B/S结构
  6. DFS_全球变暖_蓝桥杯2018省赛N0.9
  7. husky+ prettier + commitlint 提交前代码检查和提交信息规范
  8. PHP与ECMAScript_2_数据类型
  9. 网站性能优化的方法--Yahoo
  10. 01 | 健康之路 kubernetes(k8s) 实践之路 : 开篇及概况