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