開局一張圖,學一學專案管理神器Maven!
Maven強大的Java工程構建工具,做Java開發時少了跟Maven打交道,之前在知乎上看到有人提問:“學Java開發需不需要學習Maven?”,個人認為是必需要學的,這和工欲善其事必先利其器
是一個道理,開發軟體也要先把工具學好才能事半功倍
啊。所以最近花了一點時間,將Maven的基礎知識整理成一張腦圖:
這篇檔案主要簡單介紹一些Maven中的概念,文章大致內容如下:
- 安裝maven
- 配置maven
- maven的命令語法
- maven的構建徵集週期
其他的一些高階特性如依賴、外掛、settings部分留待之後再整理成。
安裝Maven
安裝Maven的步驟非常簡單、快速,安裝之前先確認JAVA_HOME
echo
命令輸出JAVA_HOME
目錄:
echo $JAVA_HOME
如果輸出為空說明JAVA_HOME
未設定或指向不正確,可以使用export
匯出JAVA_HOME
變數:
export JAVA_HOME=/path/to/java_home/
要使
JAVA_HOME
變數開機生效,可以將JAVA_HOME=/path/to/java_home/
放入.profile
或.bash_profile
視機器環境而定。
設定好JAVA_HOME
環境變數後,就可以安裝Maven了:
- 下載 apache-maven-3.6.3-bin.zip
- 使用
unzip
命令解壓apache-maven-3.6.3-bin.zip
- 新增一個
MAVEN_HOME
環境變數,指向解壓後的apache-maven-3.6.3-bin
目錄 - 將
MAVEN_HOME/bin
新增PATH
環境變數中
下載 Maven
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
解壓 Maven
unzip apache-maven-3.6.3-bin.zip
設定
MAVEN_HOME
環境變數
cd apache-maven-3.6.3 pwd #檢視當前目錄 export MAVEN_HOME=/Users/yjwfn/bin/apache-maven-3.6.3
設定
PATH
環境變數
export PATH=$PATH:$MAVEN_HOME/bin
以上配置只是當前shell終端生效
,要每次開機自動設定需要將以上命令放入~/.bash_profile
或~/.profile
中,本文使用~/.bash_profile
(不同的機器名稱會不一樣,Linux一般叫~/.profile
):
vi ~/.bash_profile
將以下命令複製到檔案中:
export MAVEN_HOME=/Users/yjwfn/bin/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
驗證安裝
使用which mvn
命令驗證安裝是否正確,檢視輸出mvn
位置是否正確:
liuweideMacBook-Pro:bin yjwfn$ which mvn
/Users/yjwfn/bin/apache-maven-3.6.3/bin/mvn
使用mvn -v
檢視安裝的 Maven 版本是否正確(因為有些系統會自帶 Maven):
liuweideMacBook-Pro:bin yjwfn$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/yjwfn/bin/apache-maven-3.6.3
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
執行 Maven
執行 Maven
命令的基本樣式由options
、goal(s)
、phase(s)
組成:
mvn [options] [<goal(s)>] [<phase(s)>]
所有的options
可以使用mvn -h
檢視:
liuweideMacBook-Pro:bin yjwfn$ mvn -h
usage: mvn [options] [<goal(s)>] [<phase(s)>]
Options:
-am,--also-make If project list is specified, also
....
Maven
命令的重點是goal(s)
、phase(s)
這兩個概念,字面意思注是目標、階段的意思。他們的使用和另外一個概念life cycles
有關,後面會詳細解釋。現在只需要明白一條Maven
命令由多個options
、goal(s)
、phase(s)
組成。
Maven配置
Maven 有三個可以修改配置的地方:
MAVEN_OPTS 環境變數
:向全域性Maven
提供額外的選項,如JVM配置引數-Xms256m -Xmx512m
;settings.xml
:檔案位於USER_HOME/.m2
目錄中,向多個Maven
專案提供統一的配置.mvn
目錄:該目錄位工程目錄根目錄中,是個隱藏的檔案- extensions.xml
- maven.config
- jvm.config
MAVEN_OPTS 使用
MAVEN_OPTS
是一個環境變數,預設是空的。為測試將MAVEN_OPTS
設定成-h
:
export MAVEN_OPTS=-h #加個-h選項
然後執行mvn
不帶任務引數就打印出usage:
用法: java [-options] class [args...]
(執行類)
或 java [-options] -jar jarfile [args...]
(執行 jar 檔案)
注意: 仔細一看這個usage
其實是Java命令輸出的java -h
:
iuweideMacBook-Pro:bin yjwfn$ java -h
用法: java [-options] class [args...]
(執行類)
或 java [-options] -jar jarfile [args...]
(執行 jar 檔案)
測試java -h
與將MAVEN_OPTS
設定成-h
然後執行mvn
打印出來的效果一致,所以MAVEN_OPTS
大家應該知道怎麼用了吧!要往JVM傳遞引數可以通過MAVEN_OPTS
變數設定。
settings.xml 檔案
settings.xml
可以放在兩個地址:
$MAVEN_HOME/conf/settings.xml
USER_HOME/.m2
中
$MAVEN_HOME
就是安裝步驟中設定的環境變數,settings.xml
的載入可以開啟--debug
選項檢視:
mvn --debug
# 部分控制檯輸出
[DEBUG] Reading global settings from /Users/yjwfn/bin/apache-maven-3.6.3/conf/settings.xml
[DEBUG] Reading user settings from /Users/yjwfn/.m2/settings.xml
如控制檯輸出一樣,會在$MAVEN_HOME
和USER_HOME/.m2
中載入兩個settings.xml
檔案。settings.xml
的配置項非常多,就不詳細說明了可以檢視官方文件。
.mvn
目錄
.mvn
目錄位於工程根目錄中,是工程級的配置一般包含三個配置檔案:
- extensions.xml
- maven.config
- jvm.config
Maven Extensions
extensions.xml
是為了使開發者更方便的使用Extensions
功能建立的配置檔案,Extensions
是一種新增庫到Core Classloader
的方式,Maven
主要有四類System Classloader -> Core Classloader -> Plugin Classloaders -> Custom Classloaders
由於CloassLoader
都是雙親委派模式,所以新增到Core Classloader
中的庫可以在Plugin Classloaders
和Custom Classloaders
中使用:
extensions.xml的配置演示:
extensions.xml
這個配置檔案就是宣告哪些庫需要新增到Core Classloader
中,如下宣告將guava
新增到Core Classloader
中:
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
<extension>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</extension>
</extensions>
maven.config
maven.config
主要用於新增通用選項,在執行mvn
命令時會將maven.config
中配置的命令options新增到命令中。
新建個maven.config檔案,內容如下:
-v
直接執行mvn
不帶任何選項,由於在maven.config
中有-v
選項,所以打出的內容就是mvn -v
:
liuweideMacBook-Pro:.mvn yjwfn$ mvn
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/yjwfn/bin/apache-maven-3.6.3
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
liuweideMacBook-Pro:.mvn yjwfn$
jvm.config
jvm.config
是配置JVM引數的檔案,很容易理解就不多說了。
Maven 構建生命週期
構建生命週期
就Maven較核心的概念, Maven有三個內建的構建生命週期分別為:clean
、default
、site
。
構建階段(Build Phase)
在Maven中一個生命週期由一系列Build Phase
組成,而每個生命週期都會有很多Build Phase
如default
生命週期由以下Build Phase
組成:
- validate -確認專案正確並且所有必要的資訊均可用
- compile -編譯專案的原始碼
- test-使用合適的單元測試框架測試編譯後的原始碼。這些測試不應要求將程式碼打包或部署
- package -獲取編譯後的程式碼,並將其打包為可分發的格式,例如JAR。
- verify -對整合測試的結果進行任何檢查,以確保符合質量標準
- install -將軟體包安裝到本地儲存庫中,以作為本地其他專案中的依賴項
- deploy -在構建環境中完成後,將最終軟體包複製到遠端儲存庫中,以便與其他開發人員和專案共享。
這些生命週期階段(加上此處未顯示的其他生命週期階段)將順序執行以完成default
生命週期。給定上面的生命週期階段,這意味著當使用default
生命週期時,Maven將首先驗證專案,然後嘗試編譯原始碼,針對測試執行原始碼,打包二進位制檔案(例如jar),針對該源執行整合測試軟體包,驗證整合測試,將經過驗證的軟體包安裝到本地儲存庫,然後將已安裝的軟體包部署到遠端儲存庫。
外掛目標(Plugin Goals)
Build Phase
只是定義一些軟體構建的流程,它不會直接去構建工程,這些構建流程的實施都是由外掛
來做的,構建生命週期可以這樣理解一個生命週期由多個構建階段組成,每個構建階段都會被多個外掛目標繫結,用一張圖表示他們之間的關係:
圖中的jar:jar
、install:install
是plugin:goal
的意思,冒號的前面部分是外掛名稱,後面是目標名稱。由上圖可知當執行mvn install
的命令時,會執行default
生命週期中的install
階段(同時在install之前的階段也會執行),由於install:install
目標繫結到了install phase
,所以install:install
目標也會執行,這樣就通過install
外掛來完成打包功能。
總結
Maven是非常流行的構建工具,下一代構建工具Gradle
也有一些點是借鑑了Maven。文中所提到的點只是Maven工具的一部分知識,Maven還有很多強大的功能如:依賴管理、外掛管理、多工程等功能,後續再整理這些高階功能與大家分享。
公眾號《架構文摘》每天一篇架構領域重磅好文,涉及一線網際網路公司應用架構(高可用、高效能、高穩定)、大資料、機器學習、Java架構等各個熱門領域。