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

Maven Wrapper(mvnw)的更多相关文章

  1. mvnw是什么(Maven Wrapper/Maven保持构建工具版本一直的工具)

    背景 Maven是一款非常流行的Java项目构建软件,它集项目的依赖管理.测试用例运行.打包.构件管理于一身,是我们工作的好帮手,maven飞速发展,它的发行版本也越来越多,如果我们的项目是基于Mav ...

  2. Maven Wrapper简介

    文章目录 简介 Maven Wrapper的结构 下载Maven Wrapper 使用 Maven Wrapper简介 简介 开发java项目少不了要用到maven或者gradle,对比gradle而 ...

  3. maven wrapper使用本地maven

    修改maven-wrapper.properties内容如下: #distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apa ...

  4. Mvnw 简介

    Mvnw 简介  8月 17, 2016 |  Nix.Huang 背景 maven是一款非常流行的java项目构建软件,它集项目的依赖管理.测试用例运行.打包.构件管理于一身,是我们工作的好帮手,m ...

  5. MavenWrapper替代Maven

    1. 说明 jdk8已经安装成功 Maven已经安装成功 参见Maven Wrapper 2. Maven初始化项目 注:初次执行,Maven会下载很多jar,需等待几分钟 mvn archetype ...

  6. SpringBoot项目下的mvnw与mvnw.cmd

    Maven是一个常用的构建工具,但是Maven的版本和插件的配合并不是那么完美,有时候你不得不切换到一个稍微旧一些的版本,以保证所有东西正常工作. 而Gradle提供了一个Wrapper,可以很好解决 ...

  7. IDEA + SpringBoot + maven 项目文件说明

    Springboot + maven + IDEA + git 项目文件介绍 1..gitignore  分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应 ...

  8. IDEA构建maven项目生成的文件详解

    IDEA构建的maven+springBoot项目结构如下: 1. .gitignore:分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应的语法,即在每一 ...

  9. mvnw 找不到或无法加载主类,找不到符号,类

    如果你出现"找不到或无法加载主类"的问题,很有可能是maven的问题,你可以尝试一下这种办法: 问题:关于maven什么东西都没动,上午可能运行都好好的,下午可能就出现了这个问题, ...

随机推荐

  1. Excel催化剂开源第43波-Excel选择对象Selection在.Net开发中的使用

    Excel的二次开发有一极大的优势所在,可以结合用户的交互进行程序的运行,大量用户的交互,都是从选择对象开始,用户选择了单元格区域.图形.图表等对象,之后再进行程序代码的加工处理,生成用户所需的最终结 ...

  2. Shiro授权流程

    1,授权中涉及的一些概念      [1]授权:访问控制,即在应用中认证用户能否访问的系统资源(如一个页面,一个按钮等).      [2]资源:在Web应用中反应为用户可以访问的URL.       ...

  3. springboot4自动配置的原理(浅层)

    自动配置的原理(浅层) @Configuration //这是一个配置类 @EnableConfigurationProperties(HttpProperties.class)//启用Configu ...

  4. 【HDOJ】2104 hide handkerchief

    Problem Description The Children’s Day has passed for some days .Has you remembered something happen ...

  5. 《ElasticSearch6.x实战教程》之实战ELK日志分析系统、多数据源同步

    第十章-实战:ELK日志分析系统 ElasticSearch.Logstash.Kibana简称ELK系统,主要用于日志的收集与分析. 一个完整的大型分布式系统,会有很多与业务不相关的系统,其中日志系 ...

  6. <<Modern CMake>> 翻译 1. CMake 介绍

    <<Modern CMake>> 翻译 1. CMake 介绍 人们喜欢讨厌构建系统. 仅仅观看 CppCon17 上的演讲,就可以看到开发人员因为构建系统而闹笑话的例子. 这 ...

  7. linux初学者-firewall篇

     linux初学者-firewall篇 firewalld是防火墙的另一种程序,与iptables相同,但是使用起来要比iptables简单的点,不需要了解3张表和5条链也可以使用. 1.firewa ...

  8. Codeforces Round #565 (Div. 3)

    传送门 A. Divide it! •题意 给定一个数n, 每次可以进行下列一种操作 1.如果n可以被2整除,用n/2代替n 2.如果n可以被3整除,用2n/3代替n 3.如果n可以被5整除,用4n/ ...

  9. python基础——列表(list)

    序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...

  10. spring aop(四)

    直接找到解析aop标签的方法: protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate deleg ...