1. 程式人生 > >Maven是什麼? Maven的概念+作用+倉庫的介紹+常用命令

Maven是什麼? Maven的概念+作用+倉庫的介紹+常用命令

## Maven系列1 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910190205528.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) ## 1.什麼是Maven? Maven是一個專案管理工具,它包含了一個物件模型。一組標準集合,一個依賴管理系統。和用來執行定義在生命週期階段中外掛目標和邏輯。 **核心功能** Maven的核心功能是合理敘述專案間的依賴關係,通俗點 就是通過pom.xml檔案的配置獲取jar包不用手動的去新增jar包,,這個pom.xml包我後面會敘述,不過已經學習過maven的 人應該對這個很熟悉。其本質就是通過配置pom.xml來獲取jar包,當然這是在該專案必須是maven專案的前提下。那麼什麼是maven專案 **maven專案是啥?** 我們這樣來理解maven專案,就是在java專案和web專案上裹了一層maven,本質上java專案還是java專案,web專案還是web專案,但是包裹了maven之後,就可以使用maven提供的一些功能,即通過pom.xml新增jar包 就像在蜜汁雞外面裹了一層面粉油炸一下變成了炸雞,但是他還是一隻雞 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/202009101907165.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910190747177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) ## 2.Maven能夠解決什麼問題 **在想Maven可以解決什麼問題之前我們先來想想我們開發過程中經常遇到什麼問題** 1、我們需要引用各種 jar 包,尤其是比較大的工程,引用的 jar 包往往有幾十個乃至上百個, 每用到一種 jar 包,都需要手動引入工程目錄,而且經常遇到各種讓人抓狂的 jar 包衝突,版本衝突。 2、我們辛辛苦苦寫好了 Java 檔案,可是隻懂 0 和 1 的白痴電腦卻完全讀不懂,需要將它編譯成二進位制位元組碼。好歹現在這項工作可以由各種整合開發工具幫我們完成,Eclipse、IDEA 等都可以將程式碼即時編譯。當然,如果你嫌生命漫長,何不鋪張,也可以用記事本來敲程式碼,然後用 javac 命令一個個地去編譯,逗電腦玩。 3、世界上沒有不存在 bug 的程式碼,計算機喜歡 bug 就和人們總是喜歡美女帥哥一樣。為了追求美為了減少 bug,因此寫完了程式碼,我們還要寫一些單元測試,然後一個個的執行來檢驗程式碼質量。 4、再優雅的程式碼也是要出來賣的。我們後面還需要把程式碼與各種配置檔案、資源整合到一起,定型打包,如果是 web 專案,還需要將之釋出到伺服器,供人蹂躪。 **maven所幫助我們解決的問題** **以上的這些問題maven都把我們解決了,沒錯maven可以幫我們 1構建工程, 2管理jar, 3.編譯程式碼, 4.自動執行單元測試, 5.打包 6.生成報表, 7.部署專案,生成web站點。** **有沒有孫悟空得到金箍棒的感覺** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910191612165.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) ## 3.接下來我就舉個例子讓大家先見識見識maven的功能 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020091019195014.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)前面我們通過web階段的專案,要能夠將專案執行起來,就必須將該專案所依賴的一些jar包新增到工程中,否則專案就不可以運行了,如果相同架構的專案有十幾個,那麼我們就需要將這一份jar包複製到十個不同的工程中我們一起來看看CRM工程的大小 **使用傳統的CRM專案** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910192312415.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) **使用maven構建** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910192351739.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) ## 4.Maven的依賴管理 為什麼使用maven之後資料夾就如此之小了呢?其實這我們在前面就提到過了即通過配置pom.xml的檔案來配置依賴,而Maven的一個核心特徵就是依賴管理,當我們涉及到多模組的專案(包含成百個模組或者子專案),管理依賴就變成了一個極為困難的任務Maven展示出了他對處理這種情形的高度控制 傳統的web專案中,我們必須將工程所依賴的jar包複製到工程中,導致工程變的很大,那麼maven是如何通過操作使工程變少的呢 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910194354918.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)通過圖解可以發現maven工程不直接將jar包匯入到工程中,而是通過再pom.xml中新增所需的jar包的座標,這樣就避免了jar直接引入進來,在需要用到jar包的時候,只要查詢pom.xml檔案,再通過pom.xml中的座標,到一個專門用於存放jar包的倉庫中根據座標從而找到這些jar包,再把這些jar包拿去執行 看到這讀者們可能會有疑問 **1.存放jar包的倉庫長什麼樣?** 這個我們會在後面一一講解,倉庫也分為許多種類 **2.通過讀取pom.xml座標,來找jar的方式會不會導致速度很慢。從而導致這些方案不可行** 通過 pom.xml 檔案配置要引入的 jar 包的座標,再讀取座標併到倉庫中載入 jar 包,這 樣我們就可以直接使用 jar 包了,為了解決這個過程中速度慢的問題,maven 中也有索引的概念,通過建立索引,可以大大提高載入 jar 包的速度,使得我們認為 jar 包基本跟放在本地的工程檔案中再讀取出來的速度是一樣的。這個過程就好比我們查閱字典時,為了能夠加快查詢到內容,書前面的目錄就好比是索引,有了這個目錄我們就可以方便找到內容了,一樣的在 maven 倉庫中有了索引我們就可以認為可以快速找到 jar 包。 ## 5.倉庫的概念 倉庫就是存放jar包的地方,即我們前面說的通過pom.xml中通過設定索引來到倉庫中尋找jar包 倉庫分為:本地倉庫,第三方倉庫,中央倉庫 **5.1本地倉庫** 用來儲存從遠端倉庫或者中央倉庫下載的外掛和jar包,專案使用一些外掛或jar包 優先從本地倉庫查詢 預設本地倉庫的位置在${user.dir}/.m2/repository,${user.dir}表示 windows 使用者目錄。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910200729205.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) **5.2第三方倉庫** d第三方倉庫,又稱為內部中心倉庫,又稱為私服 私服:一般由公司自己設立,只為本公司內部共享使用,它既可以作為公司內部構建協作和存檔,也可作為公用類庫映象快取,減少在外部訪問和下載的頻率使用私服為了減少對中央倉庫的訪問私服可以使用的是區域網,中央倉庫必須使用外網。也就是一般公司都會建立這種第三方倉庫,保證專案開發時,專案所需用的jar都從該倉庫中拿,每個人的版本就都一樣。 **注意:連線私服,需要單獨配置。如果沒有配置私服,預設不使用** **5.3中央倉庫** 在 maven 軟體中內建一個遠端倉庫地址 http://repo1.maven.org/maven2 ,它是中央倉庫,服務於整個網際網路,它是由 Maven 團隊自己維護,裡面儲存了非常全的 jar 包,它含了世界上大部分流行的開源專案構件。 **獲取jar包的過程** 優先從本地倉庫查詢,如果本地倉庫沒有該jar包,如果配置了私服,就從私服中查詢,私服中沒有就從中央倉庫中查詢,然後下載到本地倉庫,下次使用就可以直接從本地倉庫中查詢,沒有配置私服則,直接從中央倉庫中查詢 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910203705820.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) ## 6.Maven java專案結構 Maven工程目錄結構 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910204812247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)圖中有一個target目錄,是因為將該java專案進行了編譯,src/main/java下的原始碼就會編譯成.class檔案放入target目錄中,target就是輸出目錄。 作為一個 maven 工程,它的 src 目錄和 pom.xml 是必備的。 進入 src 目錄後,我們發現它裡面的目錄結構如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910204957488.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) 專案名稱 --pom.xml 核心配置,專案根下 --src --main --java java原始碼目錄 --resources java配置檔案目錄 --test --java 原始碼測試目錄 --resource 測試配置目錄 ## 7.maven的常用命令 **7.1 compile** compile是maven工程的編譯命令,作用是將 src/main/java 下的檔案編譯為 class 檔案輸出到 target 目錄下。 **7.2 test** test是maven工程的測試命令,會執行 src/test/java 下的單元測試類。 cmd 執行 mvn test 執行 src/test/java 下單元測試類,下圖為測試結果,執行 1 個測試用例,全部成功。 **7.3 clean** clean是maven工程的清理命令,執行clean會刪除target目錄及其內容 **7.4 package** package是maven工程的打包命令,對於java工程執行 package 打成 jar 包,對於 web 工程打成 war 包。 **7.5 install** install 是 maven 工程的安裝命令,執行 install 將 maven 打成 jar 包或 war 包釋出到本地倉庫。 從執行結果中,可以看出:當後面的命令執行時,前面的操作過程也都會自動執行 ## 8.maven的生命週期 maven對專案構建過程分為三套相互獨立的生命週期,這裡說的三套而且是相互獨立, 這三套分別是: Clean Lifecycle :在進行真正的構建之前進行一些清理工作。 Default Lifecycle :構建的核心部分,編譯,測試,打包,部署等等。 Site Lifecycle :生成專案報告,站點,釋出站點。 ## 9.maven的概念模型 Maven 包含了一個專案物件模型 (Project Object Model),一組標準集合,一個專案生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來執行定義在生命週期階段 (phase)中外掛(plugin)目標(goal)的邏輯。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020091114242717.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) **9.1專案物件模型**: 一個maven工程都有一個pom.xml檔案。通過pom.xml檔案定義專案的座標,專案的依賴,專案的資訊 外掛目標等 **9.2依賴管理系統**: 通過 maven 的依賴管理對專案所依賴的 jar 包進行統一管理。 比如:專案依賴 junit4.9,通過在 pom.xml 中定義 junit4.9 的依賴即使用 junit4.9,如下所示是 junit4.9 的依賴定義: ```java junit junit 4.9 test ``` **9.3 一個專案的生命週期** 使用maven完成專案的構建,專案構建包括:清理,編譯,部署等過程,maven將這些過程規範為一個生命週期,如下所示是生命週期的各階段 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200910222221107.png#pic_center) maven 通過執行一些簡單命令即可實現上邊生命週期的各各過程,比如執行 mvn compile 執行編譯、 執行 mvn clean 執行清理。 **9.4 一組標準集合** maven將整個專案管理過程定義為一組標準集合,比如通過maven構建工程有標準的目錄結構,有標準的生命週期階段,依賴管理有標準的座標定義 **9.5 外掛目標** maven管理專案生命週期都是基於外掛完成的 ## 10.使用idea開發meven專案 這個就是幾個簡單的引數配置一下沒什麼東西講,我就放個流程圖好了 **1.** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150111939.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)**2.** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150140601.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) **3.** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150204727.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) 4. ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150222573.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) 5. ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150241628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) 6. ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020091115030519.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) 7. ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150329666.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) **8.** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150433911.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)**9.** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150500619.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)**10.** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150617889.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) **11.** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911150636432.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) ## 11.獲取jar包方式 **到中央倉庫的官網上去下載** **網址:** http://search.maven.org/ http://mvnrepository.com/ **例圖:** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911151035588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center) **以上就是maven的一些基礎知識,後續我會更新更高階的maven知識 ,即我們在專案中經常使用到的,喜歡的也可以關注我,創作不易, 覺得有幫助的可以點贊收藏關注** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911160659539.png#pic_