什麼是Maven?Maven能做什麼?使用Maven的優點(對比ant打包)?怎麼使用Maven? (ps:适合0基礎初學者,大神請飄過) 一、什麼是Maven 1、定義介紹 Maven項目對象模型(POM),可以通過一小段描述資訊來管理項目的建構,報告和文檔的軟體 項目管理工具。 Maven是一個 項目管理和 綜合工具。 Maven提供了開發人員 建構一個完整的生命周期架構。開發團隊可以自動完成項目的基礎工具建設,Maven使用标準的目錄結構和預設建構生命周期。 在多個開發團隊環境時,Maven可以設定按标準在非常短的時間裡完成配置工作。由于大部分項目的設定都很簡單,并且可重複使用,Maven讓開發人員的工作更輕松,同時建立 報表, 檢查, 建構和 測試自動化設定。 Maven提供了開發人員的方式來管理:
- Builds 建構
- Documentation 文檔
- Reporting 報告
- Dependencies 依賴
- SCMs 自動化
- Releases 版本
- Distribution 分布
- mailing list 郵件清單
概括地說,Maven簡化和标準化項目建設過程。處理編譯,配置設定,文檔,團隊協作和其他任務的無縫連接配接。 Maven增加可重用性并負責建立相關的任務。最強大的功能就是能夠 自動下載下傳項目依賴庫。 Maven主要目标是提供給開發人員:
- 項目是可重複使用,易維護,更容易了解的一個綜合模型。
- 插件或互動的工具,這種聲明性的模式。
Maven項目的結構和内容在一個 XML檔案中聲明, pom.xml 項目對象模型(POM),這是整個Maven系統的基本單元。有關詳細資訊,請參閱 Maven POM的部分。 2、Maven資源庫( 點選藍色文字進傳入連結接) //建構過程依賴的三種倉庫 1、 本地Maven倉庫 2、 Maven中央庫 3、 連結遠端倉庫。 4、 Maven加載jar包到本地倉庫 Maven 位置,中央和遠端存儲庫配置和解釋,有些術語可能需要在 Maven 使用前了解。
- Maven本地資源庫
Maven 的本地資源庫是用來存儲項目的依賴庫,預設的檔案夾是 “.m2” 目錄,可能需要将其更改為另一個檔案夾。
- Maven中央存儲庫
Maven 中央存儲庫是 Maven 用來下載下傳所有項目的依賴庫的預設位置。
- 如何從Maven遠端存儲庫下載下傳?如何添加遠端庫?
并非所有的庫存儲在Maven的中央存儲庫,很多時候需要添加一些遠端倉庫來從其他位置,而不是預設的中央存儲庫下載下傳庫。
- Maven依賴機制
這裡的文章是關于傳統方式和Maven方式的依賴庫的不同,并說明 Maven 會從那裡搜尋這些庫。
- 定制庫到Maven本地資源庫
很多庫仍然不支援 Maven 的 pom.xml 的概念,這裡有一個指南來說明如何包括“非Maven支援”庫到 Maven 本地資源庫中。 二、Maven能做什麼 項目建構, 版本控制, 庫依賴大概用到的功能就這三個 1、Maven的俗話翻譯 上面Maven介紹中有很多的專業術語和專業詞彙,上面的介紹這麼說有點太高大上了,接地氣一點來說吧: Maven希望把軟體開發中的一些最佳實踐和模式都整合和固化下來,這樣使用Maven來進行開發時,開發過程更爽,生産出來的軟體更棒,具有以上所羅列的各種特性。 這幾種特性對于一個團隊一起高效的開發協作的确是非常重要的。 最佳實踐:Maven最初的誕生就是希望Apache的一些項目能夠以相同的方式來開發和建構,這樣一個開發者從一個項目轉到另外一個項目工作的時候能夠更加輕松地切換。因為項目的開發、測試、文檔生成、報表和部署,都具有一些共同的特征,這些特征就可以認為是軟體開發過程中的一些最佳實踐,當這些最佳實踐成為共識,開發的協作必然會更加高效。 那麼Maven要做的就是把這些最佳實踐固化成一個通用的項目管理方法。盡管對于不同的項目,開發中各個階段會有所不同,但是确實可以找到一條普遍适用的路徑,Maven将這條路徑以非常清晰的方式結合各種實踐模式提供給開發者。 模式:我們建立項目之後會考慮一下問題:(我的代碼放到哪?我的測試代碼放到哪?我的資源放到哪?再大粒度一些比如項目的依賴如何管理,再大到整個項目建構的生命周期模式(比如:通用的建構過程包含哪些階段?) 都是Maven這個基礎設施要提供給大家的,是Maven強制大家形成共同的認知。這樣大家就能更快速地生産出棒棒哒的軟體。 舉個栗子 在maven之前,小王每一天來公司都膽戰心驚,不知道那個實習生會昨天加班到十點幹了啥,不幸的是他的子產品要依賴實習生的,于是小王每天上班的前四個小時都會以下事情: 檢索最新代碼; while(小王還沒崩潰){ 單元測試; 更新代碼; 跑不通; } 當小王崩潰了,他跑過去問實習生:“起不來,什麼情況,你動了啥?”實習生給出了經典回答:“在我電腦上一直很好啊。”小王一氣之下,拷貝實習生所有jar包替換,終于工程起來了。小王如此死循環了一周,感覺項目這麼繼續下去要崩,于是找到了maven。 maven是啥,是絕佳的建構工具,幫你管理了從項目的開始到測試的所有過程,你可以用它(準确的說是maven的各個插件)編譯、測試、清理、部署。maven同樣可以幫你管理jar包,隻要你在pom中配好相關的配置,maven就可以貼心地幫你下載下傳好相應的依賴以及多重依賴。 有了maven一般會配合hudson一起食用。maven管理你的項目的架構,hudson用于持續繼承,及時發現團隊項目中的潛在危險。 我們來看一下有了maven之後是什麼樣子的? 小王的子產品不幸依賴了實習生的子產品。小王每天去上班首先看看hudson有沒有給項目經理發郵件。而maven下面的子產品依賴一直就是用穩定版的,項目穩如狗,美好的一天開始了。 2、項目的建構 Maven這個基礎設施落地下來,最重要的還是一個建構工具(雖然Maven建立者們不屑和Ant這樣的建構工具相提并論)。是以介紹Maven,必然還是需要先了解建構。 建構是什麼呢?簡單地說,建構就是軟體項目生産的整個過程,比如這個過程應該包括:
- 文檔和代碼的生成(有些項目會使用代碼自動生成工具,比如資料庫通路代碼的逆向工程)
- 代碼的編譯、測試和打包
- 打包好的代碼進行分發或者部署
大家看看,項目的建構可絕不僅僅是編譯軟體這件事情。除了寫代碼,在項目層面做的大部分工作,都包含在建構的過程中。有了Maven,建構中的這些過程都能夠進行良好的定義(模式、固化、共識,記住這些關鍵詞哪),而且Maven能夠幫我們串起來形成一個自動建構過程,這樣比我們手動執行要高效得多。 3、項目依賴管理 Java最大的一個優勢之一應該是整個生态中無數的架構和API,我們建立實際的項目不可避免的都需要用到這些架構和API,而它們通常都是以JAR包的形式提供。 相信很多人都經曆過JAR Hell的問題吧,事實上讓一個項目所依賴的依賴的外部jar包保持正确的版本和最新的狀态,是意見非常苦逼的事情。我們編譯項目的時候,需要在classpath上存放依賴的jar包(不管直接使用Eclipse還是手動維護Ant)。而且這些外部的jar包還會有其他依賴。你一定經曆過遞歸地一個個去下載下傳所有這些外部依賴,并且要確定下載下傳的版本都是正确的,當項目越來越複雜的時候,這是意見極其麻煩的事情。 Maven現在來拯救我們了,Maven可以自動幫我們做依賴管理,我們需要做的就是在pom檔案裡指定依賴jar包的名稱、版本号,Maven會自動下載下傳,遞歸地去下載下傳依賴的進一步依賴這件事情我們也不需要管了。 Maven還提供一個非常友善的功能:快照依賴。快照依賴指的是那些還在開發中的内部依賴包。與其經常地更新版本号來擷取最新版本,不如你直接依賴項目的快照版本。 快照版本的每一個build版本都會被下載下傳到本地倉庫,即使該快照版本已經在本地倉庫了。總是下載下傳快照依賴可以確定本地倉庫中的每一個build版本都是最新的。這對我們快速疊代開發是一個非常酷的特性。 三、Maven的優點(與ant對比) (一)、Maven的優點 1、為什麼有maven?建構是程式員每天要做的工作,而且相當長的時間花在了這上面,而maven使這系列的工作完全自動化。 2、我們一直在尋找避免重複的方法,設計的重複,文檔的重複,編碼的重複,建構的重複等,maven是跨平台的,最大的消除了建構的重複。 3、maven不僅是建構工具,它還是依賴管理工具和項目管理工具,提供了中央倉庫,能夠幫我們自動下載下傳構件。 4、為了解決的依賴的增多,版本不一緻,版本沖突,依賴臃腫等問題,它通過一個坐标系統來精确地定位每一個構件(artifact)。 5、還能幫助我們分散在各個角落的項目資訊,包括項目描述,開發者清單,版本控制系統,許可證,缺陷管理系統位址。 6、maven還為全世界的java開發者提供了一個免費的中央倉庫,在其中幾乎可以找到任何的流行開源軟體。通過衍生工具(Nexus),我們還能對其進行快速搜尋 7、maven對于目錄結構有要求,約定優于配置,使用者在項目間切換就省去了學習成本。 以下是通俗的了解 1)平時我們開發項目時,一般都是一個項目就是一個工程。我們劃分子產品時,都是使用package來進行劃分。但是,當項目很大時,有很多子子產品時,即使是package來進行劃分,也是讓人眼花缭亂。 優點一:項目非常大時,可借助Maven将一個項目拆分成多個工程,最好是一個子產品對應一個工程,利于分工協作。而且子產品之間還是可以發送消息的。 (2)同一項目的jar包 複制 和 粘貼到WEB/INF/lib下 問題:同樣的jar包重複出現在不同的工程中,一方面浪費空間,同時也讓工程臃腫 優點二:借助Maven,可将jar包僅僅儲存在“倉庫”中,有需要該檔案時,就引用該檔案接口,不需要複制檔案過來占用空間。 (3)如果jar包都到各個官網網站下載下傳,會浪費很多時間,而且可能不全。 優點三:借助Maven可以以規範的方式下載下傳jar包,因為所有的知名架構或第三方工具的jar包已經按照統一的規範存放到了Maven的中央倉庫中。 (4)一個jar包依賴的其他jar包可能沒導入到項目而導緻項目跑不起來。 優點四:Maven會自動将你要加入到項目中的jar包導入,不僅導入,而且還會将該jar包所依賴的jar包都自動導入進來。而且是導入該包的最新版本 (二)、ant優點和作用 Ant的作用:是一種基于Java的build工具
- 可以用ant編譯java類,生成class檔案
- ant可以自定義标簽、配置檔案,用于建構。
- ant可以把相關層建構成jar包 。
- ant把整個項目生成web包,并釋出到Tomcat
Ant的優點:
- 跨平台性:Ant是純Java語言編寫的,是以具有很好的跨平台性。
- 操作簡單:Ant是由一個内置任務和可選任務組成的。Ant運作時需要一個XML檔案(建構檔案)。
- Ant通過調用target樹,就可以執行各種task:每個task實作了特定接口對象。由于Ant建構檔案時XML格式的檔案,是以很容易維護和書寫,而且結構很清晰。
- Ant可以內建到開發環境中:由于Ant的跨平台性和操作簡單的特點,它很容易內建到一些開發環境中去。
(三)、差別 Maven除了具備Ant的功能外,還增加了以下主要的功能:
- 使用Project Object Model來對軟體項目管理;
- 内置了更多的隐式規則,使得建構檔案更加簡單;
- 内置依賴管理和Repository來實作依賴的管理和統一存儲;
- 内置了軟體建構的生命周期;
Maven的優點:
- 擁有約定,知道你的代碼在哪裡,放到哪裡去
- 擁有一個生命周期,例如執行 mvn install就可以自動執行編譯,測試,打包等建構過程
- 隻需要定義一個pom.xml,然後把源碼放到預設的目錄,Maven幫你處理其他事情
- 擁有依賴管理,倉庫管理
整體的比較: Ant将提供了很多可以重用的task,例如 copy, move, delete以及junit單元測試Maven則提供了很多可以重用的過程。我們可以把 Maven看成是一個"build container"這個容器可以讓我們重用從一系列的項目中抽像出來的build過程。 使用過Ant的朋友都會有這樣的體會吧。Ant提供的task級别描述,我們可以通過想寫shell一樣一個Java項目的build過程來進行描述。我們可以寫好一個build.xml檔案,來解決我們在Java程式運作編譯過程中需要解決的classpath,以及相關參數的配置問題,隻有是項目中的主要結構以及依賴的庫不變,我們很少去修改build.xml。但是如果我們要開發一個新的項目即使原有項目的build.xml寫的即使再好,其能夠複用得子產品還是比較少的。特别是對項目的結構進行修改後,想不修改build.xml都很困難。 這是因為Ant所提供的可重用的task粒度太小,雖然靈活性很強,但是我們需要糾纏很多細節的東西。 正如你所在使用Servlet容器時,并沒有告訴它如何去解包WAR檔案,在你使用Maven時,你也不需要告訴Maven如何build你的項目。Maven提供了一套抽象層用來分離項目的build邏輯。許多人一開始就被Maven所提供的依賴管理(可以通過XML來描述項目所依賴的庫的關系)打動,但是使用 Maven的主要好處還是它能為提供一個标準的開發構架用來對多個項目進行管理。 依賴管理隻是這個标準開發構架所提供的一個副産品。 如果想讓Maven實作某個build過程,例如compile, test, install,我們可以通過寫plugin的方式,很容易就實作build過程的複用。Maven可以為我們提供一個很舒适的build環境,我們不需要通過build.xml定義繁瑣的build過程,隻需要告訴這些build過程的plugin,我現在的檔案依賴的那些第三方庫,我需要實作什麼樣的build功能,就足夠了 。那些繁瑣的路徑配置資訊,以及複雜的第三方庫下載下傳設定,你通通不用考慮, Maven 都幫你實作了。

四、Maven怎麼用 1、 Maven環境安裝(自行百度) Mac OS X下Maven的安裝與配置 - 簡書 2、 建立 Maven 項目 (1)Interactive Mode**(互動模式)** 我們不妨建立一個 Java Web 項目,隻需在 cmd 中輸入: mvn archetype:generate 随後 Maven 将下載下傳 Archetype 插件及其所有的依賴插件,這些插件其實都是 jar 包,它們存放在您的 Maven 本地倉庫中。 在 cmd 中,您會看到幾百個 Archetype(原型),可将它了解為項目模闆,您得從中選擇一個。 我們的目标是建立 Java Web 項目,是以您可以選擇 maven-archetype-webapp(可以在 cmd 中進行模糊搜尋),随後 Maven 會與您進行一些對話,Maven 想知道以下資訊:
- 項目 Archetype Version(原型版本号)是什麼?—— 可選擇 1.0 版本
- 項目 groupId(組織名) 是什麼?—— 可輸入 com.smart
- 項目 artifactId(構件名)是什麼?—— 可輸入 smart-demo
- 項目 version(版本号)是什麼?—— 可輸入 1.0
- 項目 package(包名)是什麼?—— 可輸入 com.smart.demo
以上這種方式稱為 Interactive Mode**(互動模式)**。 (2)Batch Mode**(批處理模式)** 或許覺得這樣的互動過于繁瑣,那麼您也可以嘗試僅使用一條命名,來完成同樣的事情: < parent > < groupId >com.smart </ groupId > < artifactId >smart-demo </ artifactId > < version >1.0 </ version > </ parent > mvn archetype:generate -DinteractiveMode=false -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.smart -DartifactId=smart-demo -Dversion=1.0 對于maven中archetypeArtifactId的類型的選擇: 我們的目标是建立 Java Web 項目,是以您可以選擇 maven-archetype-webapp(可以在 cmd 中進行模糊搜尋大概有41種) 以上這種方式成為 Batch Mode**(批處理模式)**。 (3) IDEA 直接建立一個 Maven 項目 當然,還有第三種選擇,使用 IDE 來建立 Maven 項目,您可以使用 Eclipse、NetBeans、IDEA 來建立 Maven 項目,操作過程應該是非常簡單的。 您也可以使用 IDEA 直接打開一個 Maven 項目,隻需要 File -> Open -> 選擇 pom.xml,那麼下面您就可以在 IDEA 中開發 Maven 項目了 其實這個目錄結構還不太完備,我們需要手工添加幾個目錄上去,最終的目錄結構看起來是這樣的:
我們手工建立了三個目錄:
- src/main/java
- src/test/java
- src/test/resources
為什麼自動生成的目錄不完備?确實挺無語的,我們就不要去糾結了。不過有必要稍微解釋一下這個 Maven 目錄規範:
-
- main 目錄下是項目的主要代碼,test 目錄下存放測試相關的代碼。
- 編譯輸出後的代碼會放在target 目錄下(該目錄與 src 目錄在同一級别下,這裡沒有顯示出來)。
- java 目錄下存放 Java 代碼,resources 目錄下存放配置檔案。
- webapp 目錄下存放 Web 應用相關代碼。
- pom.xml 是 Maven 項目的配置檔案。
其中 pom.xml 稱為 Project Object Model(項目對象模型),它用于描述整個 Maven 項目,是以也稱為 Maven 描述檔案。 (4)了解 pom.xml 當 您打開自動生成的 pom.xml,或許會感覺到可讀性不太好,有必要做一下格式化,經過整理後是這樣的: < project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> < modelVersion>4.0.0</ modelVersion> < groupId>com.smart</ groupId> < artifactId>smart-demo</ artifactId> < version>1.0</ version> < packaging>jar</ packaging> < name>smart-demo Maven Webapp</ name> < url>http://maven.apache.org</ url> < dependencies> < dependency> < groupId>junit</ groupId> < artifactId>junit</ artifactId> < version>3.8.1</ version> < scope>test</ scope> </ dependency> </ dependencies> < build> < finalName>smart-demo</ finalName> </ build> </ project> 從上往下簡要說明一下:
- modelVersion:這個是 POM 的版本号,現在都是 4.0.0 的,必須得有,但不需要修改。
- groupId、artifactId、version:分别表示 Maven 項目的組織名、構件名、版本号,它們三個合起來就是 Maven **坐标,根據這個坐标可以在 Maven 倉庫中對應唯一的 **Maven 構件。
- packaging:表示該項目的打包方式,war 表示打包為 war 檔案,預設為 jar,表示打包為 jar 檔案。
- name、url:表示該項目的名稱與 URL 位址,意義不大,可以省略。
- dependencies:定義該項目的依賴關系,其中每一個 dependency 對應一個 Maven 項目,可見 Maven 坐标再次出現,還多了一個 scope,表示作用域(下面會描述)。
- build:表示與建構相關的配置,這裡的 finalName 表示最終建構後的名稱 smart-demo.war,這裡的 finalName 還可以使用另一種方式來定義(下面會描述)。
截圖視窗顯示樹狀形圖來表示pom.xml,那麼會更加清晰: Maven project樹狀形圖
可見,除了項目的基本資訊(Maven 坐标、打包方式等)以外,每個 pom.xml 都應該包括:
- Lifecycle(生命周期)
- Plugins(插件)
- Dependencies(依賴)
Lifecycle 是項目建構的生命周期,它包括 9 個 Phase(階段)。 大家知道,Maven 是一個核心加上多個插件的架構,而這些插件提供了一系列非常重要的功能,這些插件會在許多階段裡發揮重要作用。 階段*插件*作用 clean clean 清理自動生成的檔案,也就是 target 目錄 validate 由 Maven 核心負責 驗證 Maven 描述檔案是否有效 compile compiler、resources 編譯 Java 源碼 test compiler、surefire、resources 運作測試代碼 package war 項目打包,就是生成構件包,也就是打 war 包 verify 由 Maven 核心負責 驗證構件包是否有效 install install 将構件包安裝到本地倉庫 site site 生成項目站點,就是一堆靜态網頁檔案,包括 JavaDoc deploy deploy 将構件包部署到遠端倉庫 以上表格中所出現的插件名稱實際上是插件的别名(或稱為字首),比如:compiler 實際上是 org.apache.maven.plugins:maven-compiler-plugin:2.3.2,這個才是 Maven 插件的完全名稱。 每個插件又包括了一些列的 Goal(目标),以 compiler 插件為例,它包括以下目标:
-
- compiler:help:用于顯示 compiler 插件的使用幫助。
- compiler:compile:用于編譯 main 目錄下的 Java 代碼。
- compiler:testCompile:用于編譯 test 目錄下的 Java 代碼。
可見,插件目标才是具體幹活的人,一個插件包括了一個多個目标,一個階段可由零個或多個插件來提供支援。 我們可以在 pom.xml 中定義一些列的項目依賴(構件包),每個構件包都會有一個 Scope(作用域),它表示該構件包在什麼時候起作用,包括以下五種:
- compile:預設作用域,在編譯、測試、運作時有效
- test:對于測試時有效
- runtime:對于測試、運作時有效
- provided:對于編譯、測試時有效,但在運作時無效
- system:與 provided 類似,但依賴于系統資源
3、 釋出第三方Jar到本地庫中: Maven指令打包 Maven中的三個重要參數(可以看做是三級檔案夾目錄) < dependency > < groupId >org.springframework </ groupId > < artifactId >context </ artifactId > < version >3.1.0 </ version > </ dependency > Maven指令為 mvn install:install-file -Dfile=jar包所在的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar -Dfile :jar包的絕對路徑((D:\mvn\spring-context-support-3.1.0.RELEASE.jar) -DgroupId:GroupID是項目組織唯一的辨別符,實際對應JAVA的包的結構,是main目錄裡java的 目錄結構。 -DartifactId:ArtifactID就是項目的唯一的辨別符,實際對應項目的名稱,就是項目根目錄的名稱。 groupId一般分為多個段,這裡隻說兩段,第一段為域,第二段為公司名稱。域又分為org、com、cn等等許多,其中org為非營利組織,com為商業組織。舉個apache公司的tomcat項目例子:這個項目的groupId是org.apache,它的域是org(因為tomcat是非營利項目),公司名稱是apache,artigactId是tomcat。 --Dversion :版本号 執行上述mvn指令之後釋出第三方jar包到本地存放在電腦的Maven庫存中,路徑為~/.m2/repository下,生成檔案在本地庫存具體在org/springframework/context檔案夾下,随不同版本号增加3.1.0 3.1.1 …… 4、 常使用 Maven 指令 前面我們已經使用了幾個 Maven 指令,例如:mvn archetype:generate,mvn install:install-file等。其實,可使用兩種不同的方式來執行 Maven 指令: 方式一:mvn <插件>:<目标> [參數] 方式二:mvn <階段> 現在我們接觸到的都是第一種方式,而第二種方式才是我們日常中使用最頻繁的,例如:
- mvn clean:清空輸出目錄(即 target 目錄)
- mvn compile:編譯源代碼
- mvn package:生成構件包(一般為 jar 包或 war 包)
- mvn install:将構件包安裝到本地倉庫
- mvn deploy:将構件包部署到遠端倉庫
執行 Maven 指令需要注意的是:必須在 Maven 項目的根目錄處執行,也就是目前目錄下一定存在一個名為 pom.xml 的檔案。 2018/04/11