Maven的深入理解

1.Maven的理解

一個對 Maven 比較正式的定義是這麼說的:Maven 是一個項目管理工具,它包含了一個項目對象模型 (POMProject Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。

通俗的理解:如今我們構建一個項目需要用到很多第三方的類庫,如寫一個使用Spring的Web項目就需要引入大量的jar包。一個項目Jar包的數量之多往往讓我們瞠目結舌,並且Jar包之間的關係錯綜複雜,一個Jar包往往又會引用其他Jar包,缺少任何一個Jar包都會導致項目編譯失敗。

以往開發項目時,程序員往往需要花較多的精力在引用Jar包搭建項目環境上,而這一項工作尤爲艱難,少一個Jar包、多一個Jar包往往會報一些讓人摸不着頭腦的異常。

而Maven就是一款幫助程序員構建項目的工具,我們只需要告訴Maven需要哪些Jar 包,它會幫助我們下載所有的Jar,極大提升開發效率。

2.Maven倉庫

Maven倉庫用來存放Maven管理的所有Jar包。分爲:本地倉庫 和 中央倉庫。

  • 本地倉庫:Maven本地的Jar包倉庫。
  • 中央倉庫: Maven官方提供的遠程倉庫。

當項目編譯時,Maven首先從本地倉庫中尋找項目所需的Jar包,若本地倉庫沒有,再到Maven的中央倉庫下載所需Jar包。

在這裏插入圖片描述

3.Maven“座標”

在Maven中,座標是Jar包的唯一標識,Maven通過座標在倉庫中找到項目所需的Jar包。

在 pom.xml 中定義座標,內容包括:groupId、artifactId、version,詳細內容如下:

<!--項目名稱,定義爲組織名+項目名,類似包名-->

<groupId> cn.xxx.maven<com/groupId>

<!-- 模塊名稱 -->

<artifactId>maven-first </artifactId>

<!-- 當前項目版本號,snapshot 爲快照版本即非正式版本,release 爲正式發佈版本 -->

<version>0.0.1-SNAPSHOT</version>

<packaging > :打包類型

jar:執行 package 會打成 jar 包

war:執行 package 會打成 war 包

pom :用於 maven 工程的繼承,通常父工程設置爲 pom

如下代碼中,groupId和artifactId構成了一個Jar包的座標。

<dependency>
    <groupId>cn.missbe.web.search</groupId>
    <artifactId>resource-search</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • groupId:所需Jar包的項目名
  • artifactId:所需Jar包的模塊名
  • version:所需Jar包的版本號

4.Maven的依賴管理

Maven 的一個核心特性就是依賴管理。當我們涉及到多模塊的項目(包含成百個模塊或者子項目),管理依賴就變成一項困難的任務。Maven 展示出了它對處理這種情形的高度控制。傳統的 WEB 項目中,我們必須將工程所依賴的 jar 包複製到工程中,導致了工程的變得很大。那麼maven 工程是如何使得工程變得很少呢?

分析如下:
在這裏插入圖片描述

通過分析發現:maven 工程中不直接將 jar 包導入到工程中,而是通過在 pom.xml 文件中添加所需 jar包的座標,這樣就很好的避免了 jar 直接引入進來,在需要用到 jar 包的時候,只要查找 pom.xml 文件,再通過 pom.xml 文件中的座標,到一個專門用於”存放 jar 包的倉庫”(maven 倉庫)中根據座標從而找到這些 jar 包,再把這些 jar 包拿去運行。

5.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 項目核心配置文件

6.Maven基本命令

  1. -v:查詢Maven版本

    本命令用於檢查maven是否安裝成功。

    Maven安裝完成之後,在命令行輸入mvn -v,若出現maven信息,則說明安裝成功。

  2. compile:編譯

    compile 是 maven 工程的編譯命令,作用是將 src/main/java 下的文件編譯爲 class 文件輸出到 target

    目錄下。

  3. test:測試項目

    執行test目錄下的測試用例

  4. package:打包

    將項目打成jar包,對於 java 工程執行 package 打成 jar 包,對於 web 工程打成 war包

  5. clean:刪除target文件夾

    clean 是 maven 工程的清理命令,執行 clean 會刪除 target 目錄及內容

  6. install:安裝

    將當前項目放到Maven的本地倉庫中。供其他項目使用

7.Maven指令的生命週期

maven 對項目構建過程分爲三套相互獨立的生命週期,請注意這裏說的是“三套”,而且“相互獨立”,

這三套生命週期分別是:

Clean Lifecycle 在進行真正的構建之前進行一些清理工作。

Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。

Site Lifecycle 生成項目報告,站點,發佈站點

在這裏插入圖片描述

8.Maven的概念模型

Maven 包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯

在這裏插入圖片描述

  • 項目對象模型 (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>
  • 一個項目生命週期(Project Lifecycle)

使用 maven 完成項目的構建,項目構建包括:清理、編譯、測試、部署等過程,maven 將這些

過程規範爲一個生命週期,如下所示是生命週期的各各階段:

在這裏插入圖片描述

maven 通過執行一些簡單命令即可實現上邊生命週期的各各過程,比如執行 mvn compile 執行編譯、

執行 mvn clean 執行清理。

  • 一組標準集合

maven 將整個項目管理過程定義一組標準,比如:通過 maven 構建工程有標準的目錄結構,有

標準的生命週期階段、依賴管理有標準的座標定義等。

  • 插件(plugin)目標(goal)

maven 管理項目生命週期過程都是基於插件完成的。

9.pom 基本配置

pom.xml 是 Maven 項目的核心配置文件,位於每個工程的根目錄,基本配置如下:

<project > :文件的根節點 .

<modelversion >: pom.xml 使用的對象模型版本

<groupId > :項目名稱,一般寫項目的域名

<artifactId > :模塊名稱,子項目名或模塊名稱

<version >:產品的版本號 .

<packaging >:打包類型,一般有 jar、war、pom 等

<name >:項目的顯示名,常用於 Maven 生成的文檔。

<description > :項目描述,常用於 Maven 生成的文檔

<dependencies> :項目依賴構件配置,配置項目依賴構件的座標

<build>:項目構建配置,配置編譯、運行插件等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章