Maven 常見知識點整理
認識 Maven
Maven 的作用?
1.新增第三方jar包
2.解決jar包之間的依賴關係
3.獲取第三方jar包
4.將專案拆成多個工程模組
Maven 是什麼?
是Apache軟體基金會組織維護的一款自動化構建工具,專注服務於 Java 平臺的專案構建和依賴管理。
構建過程
1.清理:刪除以前的編譯結果,為重新編譯做好準備。
2.編譯:將 Java 源程式便以為位元組碼檔案。
3.測試:針對專案中的關鍵點進行測試,確保專案在迭代開發過程中關鍵點的正確性。
4.報告:在每一次測試後以標準的格式記錄和展示測試結果
5.打包:將一個包含諸多檔案的工程封裝為一個壓縮檔案用於安裝或部署。Java 工程對應 jar 包,Web 工程對應 war 包。
6.安裝:在 Maven 環境下特指將打包的結果—— jar 包或 war 包安裝到本地倉庫。
7.部署:將打包的結果部署到遠端倉庫或將 war 包部署到伺服器上執行。
Maven 核心概念
1.POM
2.約定的目錄結構
3.座標
4.依賴管理
5.倉庫管理
6.生命週期
7.外掛和目標
8.繼承
9.聚合
原理與約定
Maven 的核心程式中僅僅定義了抽象的宣告週期,具體的操作是由 Maven 的外掛完成的。Maven 的外掛不包含在 Maven 的核心程式中,在首次使用時需要聯網下載。
下載的外掛被儲存在本地倉庫,本地倉庫的預設位置是:~\.m2\repository
約定的目錄結構對於 Maven 實現自動化構建是必不可缺的一環,Maven 必須能找到 Java 原始檔,編譯後的位元組碼也有一個儲存的位置,所以約定至關重要。 目錄結構:
專案
src
main
java
resources
test
java
resources
target
src:原始碼目錄 main:主程式目錄 main->java:主程式的Java原始檔目錄 main->resources:主程式的資原始檔目錄 test:測試程式目錄 test->java:測試程式的Java原始檔目錄 test->resources:測試程式的資原始檔目錄
核心概念
POM
Project Object Model:專案物件模型。將 Java 工程的相關資訊封裝為物件作為便於操作和管理的模型。Maven 工程的核心配置。可以說學習 Maven 就是學習 pom.xml 檔案中的配置。
Maven 座標
在空間中需要 x、y、z三個向量確定一個點
使用如下三個向量在 Maven 的倉庫中唯一的確定一個 Maven 工程(gav)。
1.groupid:公司或組織的域名倒敘+當前專案名稱
2.artifactid:當前專案的模組名稱
3.version:當前模組的版本
<groupId>com.jikedaquan.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
使用命令 mvn install
執行安裝後 Maven 工程進入倉庫,通過兩個步驟查詢 jar 包。
1.將 gav 三個向量連起來
com.jikedaquan.maven+Hello+0.0.1-SNAPSHOT
2.以連起來的的字串作為目錄結構到倉庫中查詢
com/jikedaquan/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
依賴
使用 Maven 就是為了使用它的依賴功能,當 A jar 包用到了 B jar 包的某些類時,A 對 B 產生了依賴。
實現依賴:
<dependency>
<groupId>com.jikedaquan.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
依賴的範圍有:compile(編譯)、test(測試)、provided(部署)
作用 | compile | test | provided |
---|---|---|---|
主程式 | √ | × | √ |
測試程式 | √ | √ | × |
參與部署 | √ | × | × |
依賴的傳遞:A 依賴 B,B 依賴 C ,A 是否能使用 C?要看 B 依賴 C 的範圍是不是 compile
依賴的排除:
<dependencies>
<dependency>
<groupId>com.jikedaquan</groupId>
<artifactId>c</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
對版本號進行統一: 1.統一宣告版本號
<properties>
<mysql-connector.version>5.1.47</mysql-connector.version>
</properties>
2.引用前面宣告的版本號:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
倉庫
倉庫有本地倉庫和遠端倉庫,遠端倉庫包含私服、中央倉庫、中央倉庫的映象。
倉庫中儲存的檔案有 Maven 的外掛、我們自己開發的專案的模組、第三方框架或工具的 jar 包。
生命週期
Maven 生命週期定義了各個構建緩解的執行順序,有了這個清單,Maven 就可以自動化的執行構建命令了。
有3套相互獨立的生命週期,分別是:
Clean Lifecycle 在進行真正的構建之前進行的一些清理工具。
Default Lifecycle 構建的核心部分,編譯,測試,打包,安裝部署等等。
Site Lifecycle 生成專案報告,站點,釋出站點
它們是相互獨立的,你可以僅僅呼叫 clean 來清理工作目錄,僅僅呼叫 site 來生成站點。也可以直接執行 mvn clean install site 執行所有這三套宣告週期
Clean 生命週期的階段:
pre-clean 執行一些需要在 clean 之前完成的工作
clean 移除所有上一次構建生成的檔案
post-clean 執行一些需要在 clean 之後立刻完成的工作
Site 生命週期的階段:
- pre-site 執行一些需要在生成站點文件之前完成的工作
- site 生成專案的站點文件
- post-site 執行一些需要在生成站點文件之後完成的工作,並且為部署做準備
- site-deploy 將生成的站點文件部署到特定的伺服器上
Default 生命週期的階段
Default 生命週期是 Maven 生命週期中最重要的一個,絕大部分工作都發生在這個生命週期中。這裡,只解釋一些比較重要和常用的階段:
validate
generate-sources
process-sources
generate-resources
process-resources 複製並處理資原始檔,至目標目錄,準備打包
compile 編譯專案的原始碼
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 複製並處理資原始檔,至目標測試目錄
test-compile 編譯測試原始碼
process-test-classes
test 使用合適的單元測試框架執行測試。這些測試程式碼不會被打包或部署
prepare-package
package 接受編譯好的程式碼,打包成可釋出的格式,如 JAR
pre-integration-test
integration-test
verify
install 將包安裝至本地倉庫,以讓其他專案依賴
deploy 將最終的包複製到遠端的倉庫,以讓其他開發人員與專案共享或部署到伺服器上執行
執行任何一個階段的時候,它前面的所有階段都會被執行
外掛和目標
Maven 的核心僅僅定義了抽象的宣告週期,具體的任務都是交給外掛完成的。
每個外掛都能實現多個功能,每個功能就是一個外掛目標
Maven 的宣告週期與外掛目標相互繫結,以完成某個具體的構建任務
繼承
非 compile 範文的依賴資訊是不能在“依賴鏈”中傳遞的,所以有需要的工程只能單獨配置。
工程 | 依賴 |
---|---|
Hello | <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency> |
HelloFriend | <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency> |
MakeFriend | <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency> |
如果將各模組的版本統一為 4.9,各個模組單獨修改是不可取的,可以使用繼承機制將依賴資訊統一提取到父工程模組中進行統一管理。
實現繼承
1.建立父工程:打包方式設定為 pom
2.在子工程中已用父工程
<parent>
<!-- 父工程座標 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>從當前目錄到父專案的 pom.xml檔案的相對路徑</relativePath>
</parent>
如果此時子工程的 groupId 和 version 和父工程重複則可以刪除
3.在父工程中管理依賴 將 Parent 專案中的 dependencies 標籤,用 dependencyManagement 標籤括起來
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
在子專案中重新制定需要的依賴,刪除範圍和版本號
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
聚合(多模組)
將多個工程拆分為模組後,需要手動逐個安裝到倉庫後依賴才能夠生效。修改原始碼後也需藥逐個手動進行 clean 操作。而使用了聚合之後就可以批量進行 Maven 工程的安裝、清理工作。
配置聚合:
在總的聚合工程中使用 modules/module 標籤組合,指定模組工程的相對路徑集合
<modules>
<module>test</module>
<module>b</module>
</modules>
搜尋關注公眾號「享智同行」,第一時間獲取技術乾貨