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
Maven Wrapper(mvnw)的更多相关文章
- mvnw是什么(Maven Wrapper/Maven保持构建工具版本一直的工具)
背景 Maven是一款非常流行的Java项目构建软件,它集项目的依赖管理.测试用例运行.打包.构件管理于一身,是我们工作的好帮手,maven飞速发展,它的发行版本也越来越多,如果我们的项目是基于Mav ...
- Maven Wrapper简介
文章目录 简介 Maven Wrapper的结构 下载Maven Wrapper 使用 Maven Wrapper简介 简介 开发java项目少不了要用到maven或者gradle,对比gradle而 ...
- maven wrapper使用本地maven
修改maven-wrapper.properties内容如下: #distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apa ...
- Mvnw 简介
Mvnw 简介 8月 17, 2016 | Nix.Huang 背景 maven是一款非常流行的java项目构建软件,它集项目的依赖管理.测试用例运行.打包.构件管理于一身,是我们工作的好帮手,m ...
- MavenWrapper替代Maven
1. 说明 jdk8已经安装成功 Maven已经安装成功 参见Maven Wrapper 2. Maven初始化项目 注:初次执行,Maven会下载很多jar,需等待几分钟 mvn archetype ...
- SpringBoot项目下的mvnw与mvnw.cmd
Maven是一个常用的构建工具,但是Maven的版本和插件的配合并不是那么完美,有时候你不得不切换到一个稍微旧一些的版本,以保证所有东西正常工作. 而Gradle提供了一个Wrapper,可以很好解决 ...
- IDEA + SpringBoot + maven 项目文件说明
Springboot + maven + IDEA + git 项目文件介绍 1..gitignore 分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应 ...
- IDEA构建maven项目生成的文件详解
IDEA构建的maven+springBoot项目结构如下: 1. .gitignore:分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应的语法,即在每一 ...
- mvnw 找不到或无法加载主类,找不到符号,类
如果你出现"找不到或无法加载主类"的问题,很有可能是maven的问题,你可以尝试一下这种办法: 问题:关于maven什么东西都没动,上午可能运行都好好的,下午可能就出现了这个问题, ...
随机推荐
- 2017-10271weblogic漏洞exp测试及补丁测试
靶机:weblogic12.1.3.0 战斗机:kali 导弹:burpsuite 1.首先开启kali某端口监听 2.向靶机发送exp 3.查看kali监听 打码保平安~~ 4.打上补丁 5.验证补 ...
- opatch卸载weblogic12.1.3.0补丁
1.首先进入opatch目录 2.查看opatch命令(心急于卸载的朋友直接跳过这步) [weblogic@localhost OPatch]$ ./opatch -help Oracle 中间补丁程 ...
- linux weblogic12.1.3.0卸载过程
主要是一开始以为跟之前版本一样有uninstall.sh,但却找不到. 最后google 才发现改了个名字,deinstall.sh 可能后面的版本都是这个脚本了吧. 先进入脚本目录,命令:cd /h ...
- 五分钟了解Zabbix
Zabbix-简介 Zabbix概念 Zabbix组成 Server Zabbix server 是 Zabbix agent 向其报告可用性.系统完整性信息和统计信息的核心组件.是存储所有配置信息. ...
- 洛谷 P2671 求和
题目描述 一条狭长的纸带被均匀划分出了nn个格子,格子编号从11到nn.每个格子上都染了一种颜色color\_icolor_i用[1,m][1,m]当中的一个整数表示),并且写了一个数字number\ ...
- 个人永久性免费-Excel催化剂功能第92波-地理地址与经纬度互转功能
GPS设备和手机LBS的兴起,在地理信息存储过程中,在程序.应用级别是需要用经纬度去定位,而在数据分析的级别,特别是省市区镇街的分析,用到的是人可识别的文本类型存储,从设备中采集下来的数据和人工维护的 ...
- Excel催化剂开源第28波-调用Google规划求解库
在Excel催化剂的自定义函数中,有规划求解的函数,用于在一些凑数的场景,某财务工作网友向我提出的需求,例如用于凑发票额使用. 一般开发票的场景是多次采购合在一起开具,即多个订单产生后开,同时发票一般 ...
- 二、C#中数据库连接是用sqlconection 而access是用oledb对象例如:
OleDBConnection conn =new OleDBConnection();(简单记一下) 重点是研究winform 中combobox 与datagridview 的联动问题: 首先是c ...
- Kotlin学习快速入门(2)——条件 数组 循环 方法
条件 if条件判断 常用的判断和Java一样,这里提一下不同的用法 1.if可以作为三元运算符 val max = if (a > b) a else b 2.使用in判断是否在某个区间 val ...
- 有不少朋友问我Halcon和Opencv的区别?
Halcon:机器视觉行业里知名的商业视觉库,非开源的,在国内市场份额处于第一,其提供了1500个多个API算子供开发人员使用,有些编程基础的都可以轻松的入门,其调试也是很方便的,断点单步运行,图像变 ...