maven-wrapper 的应用

使用 https://start.spring.io/ 生成Spring Boot初始项目时,发现其中有几个奇怪的文件

1
2
3
4
5
6
7
8
9
10
11
├── .mvn 

│ └── wrapper

│ ├── maven-wrapper.jar

│ └── maven-wrapper.properties

├── mvnw

└── mvnw.cmd

maven-wrapper 的作用

先来看看传统 maven 的使用流程:

  • 传统使用 maven 需要先到官网上下载
  • 配置环境变量把 mvn,可执行文件路径加入到环境变量,以便之后使用直接使用 mvn 命令
  • 另外项目 pom.xml 文件描述的依赖文件默认是下载在用户目录下的 .m2 文件下的 repository 目录下
  • 再次,如果需要更换 maven 的版本,需要重新下载 maven 并替换环境变量 path 中的 maven 路径

现在有了 maven-wrapper,会获得以下特性:

  • 执行 mvnw 比如 mvnw clean ,如果本地没有匹配的 maven 版本,直接会去下载 maven,放在用户目录下的 .m2/wrapper
  • 并且项目的依赖的 jar 包会直接放在项目目录下的 repository 目录,这样可以很清晰看到当前项目的依赖文件
  • 如果需要更换 maven 的版本,只需要更改项目当前目录下.mvn/wrapper/maven-wrapper.properties 的 distributionUrl 属性值,更换对应版本的 maven 下载地址。mvnw 命令就会自动重新下载 maven
  • 可以说带有 mvnw 文件的项目,除了额外需要配置 java 环境外,只需要使用本项目的 mvnw 脚本就可以完成编译,打包、发布等一系列操作

初始化 mvnw 文件

如果你的项目没有 mvnw 文件,需要先下载 maven,并把 mvn 可执行文件路径需加入的 PATH 中。然后执行以下命令,就会自动生成 mvnw 相关一系列文件

1
mvn -N io.takari:maven:wrapper

idea 对 maven-wrapper 的支持

idea提供了插件maven-wrapper-support 这个插件会监测项目下的 .mvn/wrapper/maven-wrapper.properties 中的 distributionUrl 属性值,且自动下载 maven 版本到用户目录 .m2/wrapper 目录中,并且改变 setting -> build -> build Tools -> maven -> maven home directory 的值。但是这个插件并不会改变 setting -> build -> build Tools -> maven -> Local repository 的值;点击 Navigation Bar 中的 maven projectjs 中的命令,执行的命令是原生 mvn 的命令,而不是项目中下的mvnw命令

不足

项目目录下的 .mvn/wrapper/maven-wrapper.properties 的 distributionUrl 默认值是

1
https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip

在执行mvnw命令下载有点慢,建议替换为

1
https://www-us.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip

说说自己的看法

  • maven wrapper 可以自动下载 maven,但实际上我们常用的 idea 软件都自带了 maven
  • 且如果用上了 idea,一般习惯也是直接使用 Navigation Bar 执行 maven 命令比较方便
  • maven wrapper 根据配置自动切换 maven 版本。这个看起来很有用,但实际上 maven 版本也是很稳定。很少会出现需要切换 maven 版本的情况
  • 使用 mvnw 命令会在直接当前项目下生成 repository,看起来每一个项目独立了 repository,很模块化的样子。但是这样不仅浪费了磁盘空间,且实际上开发中并不关心 repository,idea 会自动有 external librayies 目录提供查看依赖的 jar 包
  • 当然,如果纯命令行工作,这会是个不错的选择

参考文献