Maven学习(三)————Maven核心概念(二)
引言
承接上一篇《Maven學習(二)————Maven核心概念(一)》,介紹 Maven? 生命周期、插件、目標、繼承、聚合等一些概念。
一、Maven 生命周期
1.1 理解 Maven 生命周期及主要構建過程
Maven 構建生命周期,也稱Maven 項目的生命周期,或 Maven 生命周期。
它描述了一個項目從編譯到發布的整個過程。一個典型的 Maven 工程構建(build)生命周期是由以下幾個主要階段(phase)組成的。
| 驗證 validate | 驗證項目 | 驗證項目是否正確且所有必須信息是可用的 |
| 編譯 compile | 執行編譯 | 源代碼編譯在此階段完成 |
| 測試 Test | 測試 | 使用適當的單元測試框架(例如JUnit)運行測試。 |
| 包裝 package | 打包 | 創建JAR/WAR包如在 pom.xml 中定義提及的包 |
| 檢查 verify | 檢查 | 對集成測試的結果進行檢查,以保證質量達標 |
| 安裝 install | 安裝 | 安裝打包的項目到本地倉庫,以供其他項目使用 |
| 部署 deploy | 部署 | 拷貝最終的工程包到遠程倉庫中,以共享給其他開發人員和工程 |
Maven 有三個標準生命周期:clean、 build(或default)、site(生成站點,適用于動態 web 項目)。
理解構建階段和生命周期的關系很重要,一個生命周期可以劃分為多個構建階段,Maven 的三個標準生命周期包括以下這些構建階段:
【注意】build 生命周期中總共包含 23 個構建階段,但比較重要的構建階段就是上圖這些,它們并非如圖所示是緊挨著執行的,但可以保證順序一定會如上圖所示。當我們執行 install 構建過程的時候,maven會自動從 pre-clean 階段執行,一直到 install。
1.2 構建階段與 Maven 命令
Maven 的三個標準生命周期以及構建階段,都會有特定的maven 指令,如上面所述,比較重要的構建階段包括:compile、test、install等,它們對應的命令包含但不限于以下這些:
1、mvn clean:清理上次編譯生成的 class 文件
2、mvn compile:編譯主程序(main 目錄下的源碼文件)
3、mvn test-compile:編譯測試程序(test 目錄下的源碼文件)
4、mvn test : 執行測試
5、mvn package:獲取編譯后的字節碼文件,并按照可發布的格式打包成 jar 或 war
6、mvn install:安裝工程包到本地倉庫,該 jar 包可以作為本地其他工程的依賴。
7、mvn site:生成站點(此項構建過程包含在 site 生命周期中,上圖未列出,只針對于動態 web 項目)
如果手動執行這些命令,需要在 pom.xml 文件所在的目錄下打開 cmd 才可以,否則會構建失敗。通常情況下,我們會使用開發工具中的 maven 插件來執行這些命令,而不是手動鍵入這些 maven 命令。
(目前很多項目都是 spring boot 項目,多為jar 包部署,所以本文暫不涉及 動態 web 工程相關的詳細描述)
二、Maven 插件及執行目標
2.1?插件 plugin
Maven 插件用于完成 maven 項目的實際構建工作。
上文中提到, Maven 包括三個標準生命周期,這三個標準生命周期以 build 作為重要,它們包含了許多細分的構建階段,這些階段我們可以理解為一個概念性的接口,規定了這個階段所要完成的工作,而由 Maven 插件來實際真正完成這些工作內容。
比如,我們輸入 mvn clean 來完成 clean 階段的舊字節碼文件的清理工作,但 clean 的具體操作是由 maven-clean-plugin 插件來完成的。所以說, Maven 生命周期的每一個階段的具體實現都是由 Maven 插件來完成的,Maven 實際上是一個依賴插件執行的框架。
常用的插件有如下這些:
| clean | 構建之后清理目標文件。刪除目標目錄。 |
| compiler | 編譯 Java 源文件。 |
| surefile | 運行 JUnit 單元測試。創建測試報告。 |
| jar | 從當前工程中構建 JAR 文件。 |
| war | 從當前工程中構建 WAR 文件。 |
| javadoc | 為工程生成 Javadoc。 |
| antrun | 從構建過程的任意一個階段中運行一個 ant 任務的集合。 |
2.2 目標 goal
maven 中 目標的概念與插件緊密聯系。一個插件目標可以代表一個特定的任務,它是比構建階段更精細的劃分。
這些目標被綁定在各自所屬的不同階段,或者無綁定,無綁定的目標可以穿插在構建過程之間獨立執行。
插件通常提供了一個目標的集合,并且可以使用下面的語法執行:
mvn [plugin-name]:[goal-name]例如,我們可以單獨執行 compiler插件中的 compile 目標(任務):
mvn compiler:compile三、Maven繼承
Maven 提供一種依賴繼承的方式,用于解決一些公共依賴統一版本的問題。
比如,三個maven 工程都依賴了 JUnit ,但是可能三個項目都引入了不同的版本依賴,這可能會造成某些情況下的測試結果出錯的問題。
這個時候,我們就可以將JUnit 依賴提升到父工程中,統一指定版本號。在這種情況下,子工程只需要在依賴中標明 GAV 依賴坐標的前兩項即可。這樣,就可以在父工程中統一管理版本號,便于管理。
3.1 操作步驟
由于本文是概念性描述,后面會有實操的演示,這里還需要留意記憶。
1、創建一個Maven工程作為父工程。打包方式是pom
2、在子工程中通過<parent>標簽聲明父工程的引用
3、將子工程的坐標中與父工程坐標重復的部分剔除,主要是groupId 和 version
4、在父工程中統一junit的依賴
5、在子工程中刪除junit依賴的版本號部分
【注意】配置繼承后,執行安裝命令時要先安裝父工程。
四、Maven聚合概念
到目前為止,我們已經知道,maven可以輕松的管理項目的構建。在第一篇Maven 學習中《Maven學習(一)————Maven技術概述》引言部分,我提到項目開發中,項目過大導致工程代碼龐大而出現的分工困難問題。
那么我們可以將項目拆分成多個 業務子模塊,這些模塊都是 maven 項目,然后通過彼此依賴的方式,建立聯系(注意,兩個項目 A 和 B 不能相互依賴,彼此依賴的意思是多個 maven 項目存在依賴關系,而兩個項目無法雙向依賴)。
但這依然存在一個問題,即需要在構建的時候,分別去構建每一個 maven 子工程,有沒有可以一鍵構建所有子工程的方法?
maven 聚合就是為了解決這個問題。
maven 聚合的概念本身和 maven 繼承沒有什么交集,但是為了簡化操作,在實際開發過程中,人們往往更習慣于將 maven 的父工程作為一個總的聚合工程。
操作非常簡單,只需要在 pom 文件中加入<modules>標簽項即可,如下圖所示:
這樣,只需要在 parent 項目上進行 maven 操作即可。
在接下來的文章中,我會以 demo 的形式演示一些 maven 應用于工程項目上的一些習慣性規則。包括一些在核心概念中并沒有介紹的內容,也會在下面的實踐中逐一展開。不得不說,雖然maven 應用起來非常簡單,但是要想真正弄懂,還是需要下一番功夫的。
?
總結
以上是生活随笔為你收集整理的Maven学习(三)————Maven核心概念(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lombok ——自动化方法生成器
- 下一篇: 计算机网络实验报告校园网,校园网规划与设