開局一張圖,學一學項目管理神器Maven!

Maven強大的Java工程構建工具,作Java開發時少了跟Maven打交道,以前在知乎上看到有人提問:「學Java開發需不須要學習Maven?」,我的認爲是必須要學的,這和工欲善其事必先利其器是一個道理,開發軟件也要先把工具學好才能事半功倍啊。因此最近花了一點時間,將Maven的基礎知識整理成一張腦力:java

這篇文件主要簡單介紹一些Maven中的概念,文章大體內容以下:shell

  • 安裝maven
  • 配置maven
  • maven的命令語法
  • maven的構建徵集週期

其餘的一些高級特性如依賴、插件、settings部分留待以後再整理成。apache

安裝Maven

安裝Maven的步驟很是簡單、快速,安裝以前先確認JAVA_HOME環境變量是否指向JDK主目錄可使用echo命令輸出JAVA_HOME目錄:bash

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了:機器學習

  1. 下載 apache-maven-3.6.3-bin.zip
  2. 使用unzip命令解壓apache-maven-3.6.3-bin.zip壓縮文件
  3. 添加一個MAVEN_HOME環境變量,指向解壓後的apache-maven-3.6.3-bin目錄
  4. MAVEN_HOME/bin添加PATH環境變量中

下載 Mavenjvm

wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
複製代碼

解壓 Mavenmaven

unzip apache-maven-3.6.3-bin.zip
複製代碼

設置MAVEN_HOME環境變量ide

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 命令的基本樣式由optionsgoal(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命令由多個optionsgoal(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_HOMEUSER_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 ClassloadersCustom 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有三個內置的構建生命週期分別爲:cleandefaultsite

構建階段(Build Phase)

在Maven中一個生命週期由一系列Build Phase組成,而每一個生命週期都會有不少Build Phasedefault生命週期由如下Build Phase組成:

  • validate -確認項目正確而且全部必要的信息都可用
  • compile -編譯項目的源代碼
  • test-使用合適的單元測試框架測試編譯後的源代碼。這些測試不該要求將代碼打包或部署
  • package -獲取編譯後的代碼,並將其打包爲可分發的格式,例如JAR。
  • verify -對集成測試的結果進行任何檢查,以確保符合質量標準
  • install -將軟件包安裝到本地存儲庫中,以做爲本地其餘項目中的依賴項
  • deploy -在構建環境中完成後,將最終軟件包複製到遠程存儲庫中,以便與其餘開發人員和項目共享。

這些生命週期階段(加上此處未顯示的其餘生命週期階段)將順序執行以完成default生命週期。給定上面的生命週期階段,這意味着當使用default生命週期時,Maven將首先驗證項目,而後嘗試編譯源代碼,針對測試運行源代碼,打包二進制文件(例如jar),針對該源運行集成測試軟件包,驗證集成測試,將通過驗證的軟件包安裝到本地存儲庫,而後將已安裝的軟件包部署到遠程存儲庫。

插件目標(Plugin Goals)

Build Phase只是定義一些軟件構建的流程,它不會直接去構建工程,這些構建流程的實施都是由插件來作的,構建生命週期能夠這樣理解一個生命週期由多個構建階段組成,每一個構建階段都會被多個插件目標綁定,用一張圖表示他們之間的關係:

圖中的jar:jarinstall:installplugin:goal的意思,冒號的前面部分是插件名稱,後面是目標名稱。由上圖可知當執行mvn install的命令時,會執行default生命週期中的install階段(同時在install以前的階段也會執行),因爲install:install目標綁定到了install phase,因此install:install目標也會執行,這樣就經過install插件來完成打包功能。

總結

Maven是很是流行的構建工具,下一代構建工具Gradle也有一些點是借鑑了Maven。文中所提到的點只是Maven工具的一部分知識,Maven還有不少強大的功能如:依賴管理、插件管理、多工程等功能,後續再整理這些高級功能與你們分享。


公衆號《架構文摘》天天一篇架構領域重磅好文,涉及一線互聯網公司應用架構(高可用、高性能、高穩定)、大數據、機器學習、Java架構等各個熱門領域。

相關文章
相關標籤/搜索