Maven專案管理工具
1. Maven簡介
-
1.1 什麼是Maven?
Maven 的正確發音是[ˈmevən],而不是“馬瘟”以及其他什麼瘟。Maven 在美國是一個口語化的詞語,代表專家、內行的意思。
一個對 Maven 比較正式的定義是這麼說的:Maven 是一個專案管理工具,它包含了一個 專案物件模型(POM:Project Object Model),一組標準集合,一個專案生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來執行定義在生命週期階段(phase)中外掛(plugin)目標(goal)的邏輯。 -
1.2 Maven的功能
Maven能幫你構建工程,管理 jar包,編譯程式碼,還能幫你自動執行單元測試,打包,生成報表,甚至能幫你部署專案,生成 Web 站點。
-
1.3 Maven 的兩個精典作用
-
1.3.1 Maven的依賴管理
maven 工程中不直接將 jar 包匯入到工程中,而是通過在 pom.xml 檔案中新增所需 jar包的座標,這樣就很好的避免了 jar 直接引入進來,在需要用到 jar 包的時候,只要查詢 pom.xml 檔案,再通過 pom.xml 檔案中的座標,到一個專門用於”存放 jar 包的倉庫”(maven 倉庫)中根據座標從而找到這些 jar 包,再把這些 jar 包拿去執行。 -
1.3.2 專案的一鍵構建
專案構建指的是專案從編譯、測試、執行、打包、安裝 ,部署整個過程都交給 maven 進行管理,這個過程稱為構建。
一鍵構建
指的是整個構建過程,使用 maven 一個命令可以輕鬆完成整個工作。
Maven 規範化構建流程如下:
2. Maven使用
-
2.1Maven的安裝
-
2.1.2Maven的安裝
Maven 下載後,將 Maven 解壓到一個沒有中文沒有空格的路徑下,比如 D:\software\maven 下面。
解壓後目錄結構如下:
bin:存放了 maven 的命令,比如我們前面用到的mvn tomcat:run
boot:存放了一些 maven 本身的載入程式,如類載入器等
conf:存放了 maven 的一些配置檔案,如 setting.xml 檔案
lib:存放了 maven 本身執行所需的一些 jar 包
至此我們的 maven 軟體就可以使用了,前提是你的電腦上之前已經安裝並配置好了 JDK。 -
2.1.3 Maven及JDK配置
電腦上需安裝 java 環境,安裝 JDK1.7 + 版本 (將JAVA_HOME/bin 配置環境變數 path ),我們使用的是JDK8 相關版本
配置 MAVEN_HOME ,變數值就是你的 maven 安裝 的路徑(bin目錄之前一級目錄)
上面配置了我們的 Maven 軟體,注意這個目錄就是之前你解壓 maven 的壓縮檔案包在的的目錄,最好不要有中文和空格。
-
2.1.4 Maven 軟體版本測試
通過 mvn -v命令檢查 maven 是否安裝成功,看到 maven 的版本為 3.5.2 及 java 版本為 1.8 即為安裝成功。
找開 cmd 命令,輸入 mvn –v命令,如下圖:
-
2.2 Maven 倉庫
-
2.2.1 Maven 倉庫的分類
本地倉庫 :用來儲存從遠端倉庫或中央倉庫下載的外掛和 jar 包,專案使用一些外掛或 jar 包,優先從本地倉庫查詢
預設本地倉庫位置在${user.dir}/.m2/repository
,${user.dir}
表示windows 使用者目錄。遠端倉庫(私服):如果本地需要外掛或者 jar 包,本地倉庫沒有,預設去遠端倉庫下載。
遠端倉庫可以在網際網路內也可以在區域網內。中央倉庫 :在 maven 軟體中內建一個遠端倉庫地址 http://repo1.maven.org/maven2 ,它是中
央倉庫,服務於整個網際網路,它是由 Maven 團隊自己維護,裡面儲存了非常全的 jar 包,它包
含了世界上大部分流行的開源專案構件。 -
2.2.2 Maven 本地倉庫的配置
在
MAVE_HOME/conf/settings.xml
檔案中配置本地倉庫位置(maven 的安裝目錄下):
開啟 settings.xml檔案,配置如下:
<!-- localRepository 配置本地倉庫地址
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\workSpace\plugins\maven\mavenRepository\maven_jar</localRepository>
.....................................
...
.....................................
<mirrors>
<!-- mirror 配置遠端倉庫和中央倉庫地址
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
-
2.2.3 全域性 setting 與 使用者 setting
maven 倉庫地址、私服等配置資訊需要在 setting.xml 檔案中配置,分為全域性配置和使用者配置。在 maven 安裝目錄下的有 conf/setting.xml 檔案,此 setting.xml 檔案用於 maven 的所有 project專案,它作為 maven 的全域性配置。
如需要個性配置則需要在使用者配置中設定,使用者配置的 setting.xml 檔案預設的位置在:${user.dir}/.m2/settings.xml
目錄中,${user.dir} 指windows 中的使用者目錄。
maven會先找使用者配置,如果找到則以使用者配置檔案為準,否則使用全域性配置檔案。 -
2.3 Maven 工程的認識
-
2.3.1 Maven 工程的目錄結構
作為一個 maven 工程,它的 src目錄和 pom.xml 是必備的。
進入 src目錄後,我們發現它裡面的目錄結構如下:
src/main/java —— 存放專案的.java 檔案
src/main/resources —— 存放專案資原始檔,如 spring, hibernate 配置檔案
src/test/java —— 存放所有單元測試.java 檔案,如 JUnit 測試類
src/test/resources —— 測試資原始檔
target —— 專案輸出位置,編譯後的class 檔案會輸出到此目錄
pom.xml——maven 專案核心配置檔案注意:如果是普通的 java 專案,那麼就沒有webapp 目錄。
3. Maven常用命令
我們可以在cmd 中通過一系列的 maven 命令來對我們的 maven-helloworld 工程進行編譯、測試、執行、打包、安裝、部署。
-
3.1.1 compile
compile 是 maven 工程的編譯命令,作用是將 src/main/java 下的檔案編譯為 class 檔案輸出到 target目錄下。
cmd 進入命令狀態,執行mvn compile,如下圖提示成功:
檢視 target 目錄,class 檔案已生成,編譯完成。 -
3.1.2 test
test 是 maven 工程的測試命令 mvn test,會執行src/test/java下的單元測試類。
cmd 執行 mvn test 執行 src/test/java 下單元測試類,下圖為測試結果,執行 1 個測試用例,全部成功。
-
3.1.3 clean
clean 是 maven 工程的清理命令,執行 clean 會刪除 target 目錄及內容。
-
3.1.4 package
package 是 maven 工程的打包命令,對於 java 工程執行 package 打成 jar 包,對於web 工程打成war包。
-
3.1.5 install
install 是 maven 工程的安裝命令,執行 install 將 maven 打成 jar 包或 war 包釋出到本地倉庫。
從執行結果中,可以看出:
當後面的命令執行時,前面的操作過程也都會自動執行。
4. Maven生命週期
-
4.1 Maven 指令的生命週期
maven 對專案構建過程分為三套相互獨立的生命週期,請注意這裡說的是“三套”,而且“相互獨立”,
這三套生命週期分別是:
Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
Default Lifecycle (預設生命週期)構建的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle 生成專案報告,站點,釋出站點。 -
4.2Maven的概念模型
Maven 包含了一個專案物件模型 (Project Object Model),一組標準集合,一個專案生命週期(ProjectLifecycle),一個依賴管理系統(Dependency Management System),和用來執行定義在生命週期階段(phase)中外掛(plugin)目標(goal)的邏輯。
每一個maven指令的底層都對應一個外掛。 -
專案物件模型 (Project Object Model)
一個 maven 工程都有一個 pom.xml 檔案,通過 pom.xml 檔案定義專案的座標、專案依賴、專案資訊、外掛目標等。
-
依賴管理系統(Dependency Management System)
通過 maven 的依賴管理對專案所依賴的 jar 包進行統一管理。
比如:專案依賴 junit4.9,通過在 pom.xml 中定義 junit4.9 的依賴即使用 junit4.9,如下所示是 junit4.9的依賴定義:
<!-- 依賴關係 -->
<dependencies>
<!-- 此專案執行使用 junit,所以此專案依賴 junit -->
<dependency>
<!-- junit 的專案名稱 -->
<groupId>junit</groupId>
<!-- junit 的模組名稱 -->
<artifactId>junit</artifactId>
<!-- junit 版本 -->
<version>4.9</version>
<!-- 依賴範圍:單元測試時使用 junit -->
<scope>test</scope>
</dependency>
</dependencies>
-
一個專案生命週期(Project Lifecycle)
使用 maven 完成專案的構建,專案構建包括:清理、編譯、測試、部署等過程,maven 將這些過程規範為一個生命週期,如下所示是生命週期的各各階段:
maven 通過執行一些簡單命令即可實現上邊生命週期的各各過程,比如執行 mvn compile 執行編譯、執行 mvn clean 執行清理。
5.Maven中常見配置
- 5.1依賴範圍
A 依賴 B,需要在 A 的 pom.xml 檔案中新增 B 的座標,新增座標時需要指定依賴範圍,依賴範圍包括:
compile:編譯範圍,指 A在編譯時依賴 B,此範圍為預設依賴範圍。編譯範圍的依賴會用在編譯、測試、執行,由於執行時需要所以編譯範圍的依賴會被打包。
provided:provided 依賴只有在當 JDK 或者一個容器已提供該依賴之後才使用, provided 依賴在編譯和測試時需要,在執行時不需要,比如:servlet api 被 tomcat 容器提供。
runtime:runtime 依賴在執行和測試系統的時候需要,但在編譯的時候不需要。比如:jdbc的驅動包。由於執行時需要所以 runtime 範圍的依賴會被打包。
test:test 範圍依賴 在編譯和執行時都不需要,它們只有在測試編譯和測試執行階段可用,比如:junit。由於執行時不需要所以test範圍依賴不會被打包。
system:system 範圍依賴與 provided 類似,但是你必須顯式的提供一個對於本地系統中 JAR檔案的路徑,需要指定 systemPath 磁碟路徑,system依賴不推薦使用。
在 maven-web 工程中測試各各 scop。
測試總結:
預設引入 的 jar 包 ------- compile 【預設範圍 可以不寫】(編譯、測試、執行 都有效 )
servlet-api 、jsp-api ------- provided (編譯、測試 有效, 執行時無效 防止和 tomcat 下 jar 衝突)
jdbc 驅動 jar 包 ---- runtime (測試、執行 有效 )
junit ----- test (測試有效)
依賴範圍由強到弱的順序是:compile>provided>runtime>test
- 5.2 設定 jdk 編譯版本
本教程使用 jdk1.8,需要設定編譯版本為 1.8,這裡需要使用 maven 的外掛來設定:
在 pom.xml 中加入:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
- 5.3 新增 tomcat7 外掛
在 pom 檔案中新增如下內容
6. 總結
-
6.1 maven 倉庫
1、maven 倉庫的型別有哪些?
本地倉庫、遠端倉庫(私服)、中央倉庫。2、maven 工程查詢倉庫的流程是什麼?
本地倉庫》遠端倉庫(私服)》中央倉庫。3、本地倉庫如何配置?
pom.xml檔案中配置localRepository屬性。 -
6.2 常用的 maven 命令
常用 的 maven 命令包括:
compile:編譯
clean:清理
test:測試
package:打包
install:安裝 -
6.3 座標定義
在 pom.xml 中定義座標,內容包括:groupId、artifactId、version,詳細內容如下:
<!--專案名稱,定義為組織名+專案名,類似包名-->
<groupId>cn.itcast.maven</groupId>
<!-- 模組名稱 -->
<artifactId>maven-first</artifactId>
<!-- 當前專案版本號,snapshot 為快照版本即非正式版本,release為正式釋出版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包型別
jar:執行 package 會打成 jar 包
war:執行 package 會打成 war 包
pom :用於 maven 工程的繼承,通常父工程設定為 pom
- 6.4 pom.xml 的基本配置
pom.xml 是 Maven 專案的核心配置檔案,位於每個工程的根目錄,基本配置如下:
<project > :檔案的根節點 .
<modelversion > : pom.xml 使用的物件模型版本
<groupId > :專案名稱,一般寫專案的域名
<artifactId > :模組名稱,子專案名或模組名稱
<version > :產品的版本號 .
<packaging > :打包型別,一般有 jar、war、pom 等
<name > :專案的顯示名,常用於 Maven 生成的文件。
<description > :專案描述,常用於 Maven 生成的文件
<dependencies> :專案依賴構件配置,配置專案依賴構件的座標
<build> :專案構建配置,配置編譯、執行外掛等。
-
6.5 jar包依賴衝突調解原則
maven 自動按照下邊的原則調解: -
1 、第一宣告者優先原則
在 pom 檔案定義依賴,先宣告的依賴為準(從上往下)。 -
2 、路徑近者優先原則
直接依賴優先於傳遞依賴。 -
3、 排除依賴
使用<exclusion>
標籤排除。
-
4、鎖定版本
面對眾多的依賴,有一種方法不用考慮依賴路徑、宣告優化等因素可以採用直接鎖定版本的方法確定依賴構件的版本,版本鎖定後則不考慮依賴的宣告順序或依賴的路徑,以鎖定的版本的為準新增到工程中,此方法在企業開發中常用。
如下的配置是鎖定了 spring-beans 和 spring-context 的版本:
還可以把版本號提取出來,使用標籤設定成變數。
注意:在工程中鎖定依賴的版本並不代表在工程中添加了依賴,如果工程需要新增鎖定版本的依賴則需要單獨新增
<dependencies></dependencies>
標籤,如下:
上邊新增的依賴並沒有指定版本,原因是已在
<dependencyManagement>
中鎖定了版本,所以在<dependency>
下不需要再指定版本。