【maven】maven基礎篇 - 學習筆記

【目錄結構】

1. What is Maven?

2. Maven的依賴管理

3. Maven的一鍵構建

    3.1 構建的概念

    3.2 構建的幾個重要環節

    3.3 Maven的一鍵構建(或者叫自動構建)

4. Maven倉庫的種類和彼此關係

5. Maven標準目錄結構

6. Maven的生命週期

7. Maven的概念模型

寫在最後的話

 

#1#->【What is Maven?】


-Mavenmeɪvn], a Yiddish word meaning “accumulator of knowledge”.

(在美國是一個口語化的詞語,表示“專家、內行”的意思。)

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

結合實際開發中遇到的一些問題先看看Maven能幫我們做什麼。

1、程序開發中需要引用各種jar包,每用到一種jar包,都需要手動引入工程目錄,較大的工程引用的jar包甚至有幾十個乃至上百個,而且經常遇到各種讓人抓狂的jar包衝突,版本衝突。

2、程序員開發寫的都是Java文件,只認二進制字節碼的計算機是讀不懂的,必須對java文件進行編譯生成.class文件,計算機才能讀懂。現在這項工作已經可以由各種集成開發工具幫助我們完成,如EclipseIntelliJ IDEA等都可以將代碼即時編譯。

3、bug無所不在,因此需要進行單元測試,一個一個運行來檢驗代碼質量。

4、開發完成以後需要把代碼與各種配置文件、資源整合到一起,定型打包,如果是web項目,還需要發佈到服務器上。

第1個問題,程序開發中需要引用各種jar包,每用到一種jar包,都需要手動引入工程目錄,這個過程是非常繁瑣且煩人的。較大的工程引用的jar包甚至有幾十個乃至上百個,引用的jar包多了,隨之而來的就是各種jar包衝突、版本衝突等問題,而手動解決jar包衝突是非常複雜的,作爲一個java開發人員,我們不希望天天被這種問題所困擾,所以這個項目如果現在交給Maven來管理,那麼jar包衝突解決起來就非常簡單了。這是Maven能爲我們做的第一件事,解決jar包衝突。

第2個問題,程序員開發寫的都是java文件,而只認二進制字節碼的計算機是讀不懂的,必須對java文件進行編譯生成.class文件,計算機才能讀懂。現在這項工作已經可以由各種集成開發工具幫助我們完成,如Eclipse、IDEA等都可以將代碼即時編譯。Maven也能幫我們完成代碼的編譯工作。這是Maven能爲我們做的第二件事,編譯代碼。

第3個問題,寫代碼的人都知道bug是無所不在的,這世上並沒有絕對完美的代碼,爲了減少bug,必須進行單元測試,保證代碼質量。但隨着代碼越來越多,測試也越來越多,如果通過Maven管理,它能把指定目錄下的單元測試全部一次性執行完成,並且生成報告告訴你哪些是正確的哪些是有異常的,這是Maven能爲我們做的第三件事情,進行單元測試。

第4個問題,項目開發完成以後需要將各種配置文件、資源文件進行打包,如果是web項目,還需要將完成後的打包文件發佈到服務器上。在傳統的開發過程中,項目完成以後都需要自己手動打包,但現在如果用Maven來管理項目,僅僅需要一個命令就能搞定。這是Maven能爲我們做的第四件事情。

小結:與傳統的開發過程相比,Maven能幫助我們解決各種各樣的問題。它能幫你構建工程,管理jar包,編譯代碼,還能幫你自動運行單元測試,打包,生成報告,甚至能幫你部署項目,生成Web站點等等。總而言之,這是一款非常強大的項目管理工具!

 

#2#->【Maven的依賴管理】


傳統的Javaweb工程,所依賴的第三方jar包都會放在項目中,一般存放在lib文件夾下,比如我平時開發的項目主要就用到了這4個jar包。

而在基於Maven開發的工程中,所依賴的jar包並不在項目中,所有的jar包會存放在一個jar包倉庫,當要使用jar包的時候,會通過一個jar包的座標去jar包倉庫中取用。

當僅考慮一個工程文件的時候,其實傳統的Javaweb工程和基於Maven開發的工程,jar包所佔用的空間大小並沒什麼區別,Maven只是把jar包放在了倉庫中而已。但是實際情況中,當有多個工程文件重複使用jar包,傳統工程就會造成大量重複jar包文件佔用磁盤空間,造成浪費。如果是基於Maven開發的工程,實際項目中不存放jar包,僅僅通過jar包座標去jar包倉庫去取用,多個工程可以共享一個jar包倉庫。Maven的這個管理過程完美踐行了java代碼開發的標準之一即代碼可重用

那麼到底什麼是依賴管理呢?依賴管理用一句話總結就是Maven工程對jar包的管理過程。傳統Javaweb工程將jar包放在項目中,而Maven將實際的jar包放在倉庫中,當項目編譯或運行的時候,Maven工程會通過jar包的座標去倉庫中找到對應的jar包。

 

#3#->【Maven的一鍵構建】


3.1 構建的概念

構建並不等同於創建,要了解構建的含義我們需要由淺入深地從以下三個方面來看:

Java代碼

Java是一門編譯型語言,源文件(.java)需要編譯成二進制的字節碼文件(.class)才能夠執行。所以編寫任何的Java代碼必須經過編譯得到.class文件才能執行。

Web工程

當需要通過瀏覽器訪問Java程序時就必須將包含Java程序的Web工程編譯的結果到服務器上指定目錄下,並啓動服務器纔行,而這個的過程叫“部署”。

實際項目

在實際項目中整合第三方框架,web工程中處理Java程序和jsp、圖片等靜態資源之外還包括第三方框架的jar包以及各種各樣的配置文件。所有這些資源都必須按照正確的目錄結構部署到服務器上,項目才能正常運行。

綜上所述

構建就是以我們編寫的Java代碼、框架配置文件、其他資源文件和jsp頁面、圖片等靜態資源作爲“原材料”,去“生產”出一個可以運行的項目的過程。

3.2 構建的幾個重要環節

構建一共涉及到7個重要環節,分別是清理、編譯、測試、報告、打包、安裝和部署。

 3.3 Maven的一鍵構建(或者叫自動構建)

現在我們來梳理一下Emma一天中的工作內容 

Emma收到QA小組郵件通報有bug存在,她開始經過編譯、打包、部署、測試等步驟運行項目,分析具體的問題,然後修改代碼,再通過編譯、打包、部署、測試完成以後重新發布項目,最後回覆QA小組郵件報告bug修復完畢。 

從中我們發現,Emma的很大一部分時間花在了“編譯、打包、部署、測試”這些程式化的工作上面,而真正需要由Emma本人智慧實現的分析問題和編碼卻只佔了很少一部分。能否將這些程式化的工作交給機器自動完成呢?——當然可以!這就是自動化構建

 

 Maven又是如何實現自動化構建的呢?簡單的說來就是它可以自動的從構建過程的起點一直執行到終點。即Maven已經完全接管了包含清理、編譯、測試、運行、打包、安裝、部署等過程,並自動地從構建過程的起點一直執行到終點,不需要人爲干涉,完全實現自動化構建的過程。

 

#4#->【Maven倉庫的種類和彼此關係】


我們都知道maven工程裏沒有jar包,jar包都放在倉庫裏。

當安裝完maven後會指定一個本地倉庫的默認地址,在maven安裝目錄conf文件夾下【settings.xml】有這樣一句話:

Default: ${user.home}/.m2/repository

默認的本地倉庫會創建在系統盤一般都是C盤下的 .m2/repository 這個文件夾,爲了節省系統盤的空間,我們可以自己指定本地倉庫的位置,如下所示,我將本地倉庫的默認位置進行了修改。

  <!-- 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>E:\maven\MyLocalRepository</localRepository>

maven工程內沒有放置jar包,放置的只是jar包的座標,當啓動一個maven工程,會通過本地的jar包座標去本地倉庫中尋找對應的jar包。

如果本地倉庫中沒有jar包,此時計算機又是聯網狀態,它會自己找到一個叫中央倉庫的地方,直接自動下載jar包到本地倉庫中,如果沒有聯網,會報錯,因爲找不着所需的jar包。

中央倉庫放置了幾乎所有的開源的jar包。一般這個中央倉庫的地址都在國外,下載速度非常慢,因此一般會改成國內的鏡像地址,下載速度會提高很多。例如,這裏添加了阿里雲提供的maven鏡像地址,在【settings.xml】中  <mirrors>  </mirrors>標籤中添加如下地址即可。

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url> 
</mirror>

在公司開發中,爲了能在不聯網的情況下也能正常完成開發任務,把公司內部開發所需的jar包統一放置在一個地方,構建一個新的倉庫叫遠程倉庫,在公司中也經常被叫作私服。在公司開發的時候,只需要確保我們自己的電腦和遠程倉庫在同一個局域網內,就可以直接通過局域網從遠程倉庫直接下載jar包到本地倉庫

假如遠程倉庫沒有我們所需的jar包,遠程倉庫會直接去中央倉庫中下載,也可以通過本地倉庫上傳的方式獲取jar包。即遠程倉庫中的jar包有一部分來源於中央倉庫的下載,有一部分來源於本地倉庫的上傳。

小結:

倉庫分三類——本地倉庫遠程倉庫(私服)中央倉庫

->當啓動一個maven工程,maven會通過pom.xml文件中jar包的座標去本地倉庫尋找對應的jar包。

->默認情況下,如果本地倉庫沒有對應的jar包,在聯網情況下,maven會自動去中央倉庫下載jar包到本地倉庫。

->在公司中(通常不聯網的情況下),如果本地倉庫沒有對應的jar包,maven會先從遠程倉庫(私服)下載jar包。如果遠程倉庫(私服)也沒有,可以從中央倉庫下載,也可以通過本地倉庫上傳

 

#5#->【Maven標準目錄結構】


一個工程一般包含以下四個方面,核心代碼部分、配置文件部分、測試代碼部分和測試配置文件,相對應的,maven在創建工程時也已經對應每個部分創建了相應的文件夾,如上圖所示,這個目錄結構是maven已經設置好的規範標準,不允許修改。其中src/main/webapp是創建web工程時纔有的目錄結構,如果是普通的java工程,就只包含了其他4個目錄。

 

#6#->【Maven項目的生命週期】


maven對項目構建過程分爲三套相互獨立的生命週期

- Clean Lifecycle (清理生命週期) 在進行真正的構建之前進行一些清理工作  clean

- Default Lifecycle (默認生命週期) 構建的核心部分,包括編譯(compile)、測試(test)、打包(package)、安裝(install)和發佈(deploy)等

- Site Lifecycle (站點生命週期) 生成項目報告、站點,發佈站點。

 

#7#->【Maven的概念模型】 


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

-> 項目對象模型(POM)

  • 項目自身信息
  • 項目運行所依賴的jar包信息
  • 項目運行環境信息,如:jdk、tomcat信息

-> 依賴管理系統(Dependency Management System)

通過maven的依賴管理對項目所依賴的jar包進行統一管理。

每一個jar包都需要包含4個部分,即公司組織的名稱、項目名、版本號以及指定作用域,作用域可以缺省不寫。

<dependency>
    <groupId>junit</groupId>  --(公司組織的名稱)
    <artifactId>junit</artifactId> --(項目名)
    <version>4.12</version>  --(版本號)
    <scope>test</scope>  --(作用域)
</dependency>

-> 一個項目生命週期(Project Lifecycle)

使用maven完成項目的構建,項目構建包括:清理、編譯、測試、部署等過程,maven將這些過程規範爲一個生命週期,如下所示是生命週期的各個階段。每一個構建項目的命令都對應了maven底層的一個插件。

-> 一組標準集合

maven將整個項目管理過程定義一組標準,比如:通過maven構建工程有標準的目錄結構,有標準的生命週期階段、依賴管理有標準的jar包座標定義等等。

-> 插件目標(plugin goal)

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

 

#->【寫在最後的話】


Maven官方文檔:https://maven.apache.org/

Maven Repository: https://mvnrepository.com/

學習資料來源:https://www.bilibili.com/video/av70969191?p=30

學習資料在評論區可以找到,如果需要也可以私信我。

 

一些運行demo中遇到的問題小結

【Maven】記第一次使用maven創建web工程遇到的坑

https://blog.csdn.net/coralime/article/details/104699219

【MySQL】最新版8.0.15遇到的一些坑

https://blog.csdn.net/coralime/article/details/104780867

【maven】idea中基於maven-webapp骨架創建的web.xml問題

https://blog.csdn.net/coralime/article/details/104847223

【maven】jar包版本衝突解決的四種方式

https://blog.csdn.net/coralime/article/details/104863126

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