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已經考慮了這種情況。在執行./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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM