項目工具【Maven】

第一章 什麼是 Maven


什麼是 Maven


Maven 的正確發音是[ˈmevən],而不是“馬瘟”以及其他什麼瘟。Maven 在美國是一個口語化的詞語,代表專家、內行的意思。

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

Maven 能解決什麼問題


可以用更通俗的方式來說明。我們知道,項目開發不僅僅是寫寫代碼而已,期間會伴隨着各種 必不可少的事情要做,下面列舉幾個感受一下:

  • 我們需要引用各種 jar 包,尤其是比較大的工程,引用的 jar 包往往有幾十個乃至上百個, 每用到一種jar 包,都需要手動引入工程目錄,而且經常遇到各種讓人抓狂的 jar 包衝突,版本衝突。

  • 我們辛辛苦苦寫好了 Java 文件,可是隻懂 0 和 1 的白癡電腦卻完全讀不懂,需要將它編譯成二進制字節碼。好歹現在這項工作可以由各種集成開發工具幫我們完成,Eclipse、IDEA 等都可以將代碼即時編譯。當然,如果你嫌生命漫長,何不鋪張,也可以用記事本來敲代碼,然後用 javac 命令一個個地去編譯,逗電腦玩。

  • 世界上沒有不存在 bug 的代碼,計算機喜歡 bug 就和人們總是喜歡美女帥哥一樣。爲了追求美爲了減少 bug,因此寫完了代碼,我們還要寫一些單元測試,然後一個個的運行來檢驗代碼質量。

  • 再優雅的代碼也是要出來賣的。我們後面還需要把代碼與各種配置文件、資源整合到一起,定型 打包,如果是 web 項目,還需要將之發佈到服務器,供人蹂躪。

試想,如果現在有一種工具,可以把你從上面的繁瑣工作中解放出來,能幫你構建工程,管理 jar 包,編譯代碼,還能幫你自動運行單元測試,打包,生成報表,甚至能幫你部署項目,生成 Web 站點,你會心動嗎?Maven 就可以解決上面所提到的這些問題。

Maven 的依賴管理


Maven 的一個核心特性就是依賴管理。當我們涉及到多模塊的項目(包含成百個模塊或者子項目),管理依賴就變成一項困難的任務。Maven 展示出了它對處理這種情形的高度控制。

傳統的WEB 項目中,我們必須將工程所依賴的 jar 包複製到工程中,導致了工程的變得很大。那麼
maven 工程是如何使得工程變得很少呢? 分析如下:
在這裏插入圖片描述

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

那麼問題來了

  • 第一:”存放jar 包的倉庫”長什麼樣?

  • 第二:通過讀取 pom.xml 文件中的座標,再到倉庫中找到 jar 包,會不會很慢?從而導致這種方式不可行!

第一個問題:存放 jar 包的倉庫長什麼樣,這一點我們後期會分析倉庫的分類,也會帶大家去看我們的本地的倉庫長什麼樣。

第二個問題:通過pom.xml 文件配置要引入的jar 包的座標,再讀取座標併到倉庫中加載jar 包,這樣我們就可以直接使用jar 包了,爲了解決這個過程中速度慢的問題,maven 中也有索引的概念,通過建立索引,可以大大提高加載 jar 包的速度,使得我們認爲 jar 包基本跟放在本地的工程文件中再讀取出來的速度是一樣的。這個過程就好比我們查閱字典時,爲了能夠加快查找到內容,書前面的 目錄就好比是索引,有了這個目錄我們就可以方便找到內容了,一樣的在maven 倉庫中有了索引我們就可以認爲可以快速找到jar 包。

項目的一鍵構建


我們的項目,往往都要經歷編譯、測試、運行、打包、安裝 ,部署等一系列過程。什麼是構建?

指的是項目從編譯、測試、運行、打包、安裝 ,部署整個過程都交給 maven 進行管理,這個過程稱爲構建。

一鍵構建

  • 指的是整個構建過程,使用 maven 一個命令可以輕鬆完成整個工作。

Maven 規範化構建流程如下:

在這裏插入圖片描述

我們一起來看 Hello-Maven 工程的一鍵運行的過程。通過 tomcat:run 的這個命令,我們發現現在的工程編譯,測試,運行都變得非常簡單。

Maven 倉庫的分類


maven 的工作需要從倉庫下載一些 jar 包,如下圖所示,本地的項目 A、項目 B 等都會通過 maven 軟件從遠程倉庫(可以理解爲互聯網上的倉庫)下載 jar 包並存在本地倉庫,本地倉庫就是本地文件夾,當第二次需要此 jar 包時則不再從遠程倉庫下載,因爲本地倉庫已經存在了,可以將本地倉庫理解爲緩存,有了本地倉庫就不用每次從遠程倉庫下載了。

下圖描述了maven 中倉庫的類型:

在這裏插入圖片描述

  • 本地倉庫 :用來存儲從遠程倉庫或中央倉庫下載的插件和jar 包,項目使用一些插件或jar 包, 優先從本地倉庫查找

默認本地倉庫位置在 user.dir/.m2/repository{user.dir}/.m2/repository,{user.dir}表示windows 用戶目錄。

  • 遠程倉庫:如果本地需要插件或者jar包,本地倉庫沒有,默認去遠程倉庫下載。遠程倉庫可以在互聯網內也可以在局域網內。

  • 中央倉庫 :在 maven 軟件中內置一個遠程倉庫地址 http://repo1.maven.org/maven2
    ,它是中央倉庫,服務於整個互聯網,它是由 Maven 團隊自己維護,裏面存儲了非常全的 jar 包,它包含了世界上大部分流行的開源項目構件。

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 目錄。

第二章 Maven的使用


我們可以在cmd 中通過一系列的maven 命令來對我們的maven-helloworld 工程進行編譯、測試、運行、打包、安裝、部署。

  • compile 是 maven 工程的編譯命令,作用是將 src/main/java 下的文件編譯爲 class 文件輸出到 target
    目錄下。
  • test 是maven 工程的測試命令 mvn test,會執行src/test/java 下的單元測試類。
  • clean 是maven 工程的清理命令,執行 clean 會刪除target 目錄及內容。
  • package 是maven 工程的打包命令,對於java 工程執行package 打成jar 包,對於web 工程打成war包。
  • install 是maven 工程的安裝命令,執行install 將maven 打成jar 包或 war 包發佈到本地倉庫。

當後面的命令執行時,前面的操作過程也都會自動執行,

Maven 指令的生命週期


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

  • Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
  • Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
  • Site Lifecycle 生成項目報告,站點,發佈站點。

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 管理項目生命週期過程都是基於插件完成的。

添加jar 包的座標時,還可以指定這個jar 包將來的作用範圍。
每個 maven 工程都需要定義本工程的座標,座標是 maven 對 jar 包的身份定義,比如:入門程序的座標定義如下:

<!--項目名稱,定義爲組織名+項目名,類似包名-->
<groupId>com.itheima</groupId>
<!-- 模塊名稱 -->
<artifactId>hello_maven</artifactId>
<!-- 當前項目版本號,snapshot 爲快照版本即非正式版本,release 爲正式發佈版本 -->

<version>0.0.1-SNAPSHOT</version>
<packaging > :打包類型
jar:執行package 會打成jar 包
war:執行package 會打成war 包
pom :用於maven 工程的繼承,通常父工程設置爲pom

座標的來源方式


添加依賴需要指定依賴 jar 包的座標,但是很多情況我們是不知道 jar 包的的座標,可以通過如下方式查詢:

從互聯網搜索


http://search.maven.org/ http://mvnrepository.com/
網站搜索示例:

在這裏插入圖片描述在這裏插入圖片描述

依賴範圍


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 工程中測試各個scope。測試總結:

  • 默認引入 的jar 包 ------- compile 【默認範圍 可以不寫】(編譯、測試、運行 都有效 )
  • servlet-api 、jsp-api ------- provided (編譯、測試 有效, 運行時無效 防止和tomcat 下jar 衝突)
  • jdbc 驅動jar 包 ---- runtime (測試、運行 有效 )
  • junit ----- test (測試有效)

依賴範圍由強到弱的順序是:compile>provided>runtime>test

pom 基本配置


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

<project > :文件的根節點 .
<modelversion > : pom.xml 使用的對象模型版本
<groupId > :項目名稱,一般寫項目的域名
<artifactId > :模塊名稱,子項目名或模塊名稱
<version > :產品的版本號 .
<packaging > :打包類型,一般有jar、war、pom 等
<name > :項目的顯示名,常用於 Maven 生成的文檔。
<description > :項目描述,常用於 Maven 生成的文檔
<dependencies> :項目依賴構件配置,配置項目依賴構件的座標
<build> :項目構建配置,配置編譯、運行插件等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章