轉載:https://blog.csdn.net/qq_35462834/article/details/80353748html
什麼是Maven?Maven能作什麼?使用Maven的優勢(對比ant打包)?怎麼使用Maven?
(ps:適合0基礎初學者,大神請飄過)
1、什麼是Maven
一、定義介紹
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的部分。
二、Maven資源庫(點擊藍色文字進入連接)
//構建過程依賴的三種倉庫
一、本地Maven倉庫
二、Maven中央庫
三、連接遠程倉庫。
四、Maven加載jar包到本地倉庫
Maven 位置,中央和遠程存儲庫配置和解釋,有些術語可能須要在 Maven 使用前理解。
Maven 的本地資源庫是用來存儲項目的依賴庫,默認的文件夾是 「.m2」 目錄,可能須要將其更改成另外一個文件夾。
Maven 中央存儲庫是 Maven 用來下載全部項目的依賴庫的默認位置。
並不是全部的庫存儲在Maven的中央存儲庫,不少時候須要添加一些遠程倉庫來從其餘位置,而不是默認的中央存儲庫下載庫。
這裏的文章是關於傳統方式和Maven方式的依賴庫的不一樣,並說明 Maven 會從那裏搜索這些庫。
不少庫仍然不支持 Maven 的 pom.xml 的概念,這裏有一個指南來講明如何包括「非Maven支持」庫到 Maven 本地資源庫中。
2、Maven能作什麼
項目構建,版本控制,庫依賴大概用到的功能就這三個
一、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下面的模塊依賴一直就是用穩定版的,項目穩如狗,美好的一天開始了。
二、項目的構建
Maven這個基礎設施落地下來,最重要的仍是一個構建工具(雖然Maven建立者們不屑和Ant這樣的構建工具相提並論)。因此介紹Maven,必然仍是須要先了解構建。
構建是什麼呢?簡單地說,構建就是軟件項目生產的整個過程,好比這個過程應該包括:
- 文檔和代碼的生成(有些項目會使用代碼自動生成工具,好比數據庫訪問代碼的逆向工程)
- 代碼的編譯、測試和打包
- 打包好的代碼進行分發或者部署
你們看看,項目的構建可毫不僅僅是編譯軟件這件事情。除了寫代碼,在項目層面作的大部分工做,都包含在構建的過程當中。有了Maven,構建中的這些過程都可以進行良好的定義(模式、固化、共識,記住這些關鍵詞哪),並且Maven可以幫咱們串起來造成一個自動構建過程,這樣比咱們手動執行要高效得多。
三、項目依賴管理
Java最大的一個優點之一應該是整個生態中無數的框架和API,咱們建立實際的項目不可避免的都須要用到這些框架和API,而它們一般都是以JAR包的形式提供。 相信不少人都經歷過JAR Hell的問題吧,事實上讓一個項目所依賴的依賴的外部jar包保持正確的版本和最新的狀態,是意見很是苦逼的事情。咱們編譯項目的時候,須要在classpath上存放依賴的jar包(無論直接使用Eclipse仍是手動維護Ant)。並且這些外部的jar包還會有其餘依賴。你必定經歷過遞歸地一個個去下載全部這些外部依賴,而且要確保下載的版本都是正確的,當項目愈來愈複雜的時候,這是意見極其麻煩的事情。
Maven如今來拯救咱們了,Maven能夠自動幫咱們作依賴管理,咱們須要作的就是在pom文件裏指定依賴jar包的名稱、版本號,Maven會自動下載,遞歸地去下載依賴的進一步依賴這件事情咱們也不須要管了。
Maven還提供一個很是方便的功能:快照依賴。快照依賴指的是那些還在開發中的內部依賴包。與其常常地更新版本號來獲取最新版本,不如你直接依賴項目的快照版本。快照版本的每個build版本都會被下載到本地倉庫,即便該快照版本已經在本地倉庫了。老是下載快照依賴能夠確保本地倉庫中的每個build版本都是最新的。這對咱們快速迭代開發是一個很是酷的特性。
3、Maven的優勢(與ant對比)
(一)、Maven的優勢
一、爲何有maven?構建是程序員天天要作的工做,並且至關長的時間花在了這上面,而maven使這系列的工做徹底自動化。
二、咱們一直在尋找避免重複的方法,設計的重複,文檔的重複,編碼的重複,構建的重複等,maven是跨平臺的,最大的消除了構建的重複。
三、maven不只是構建工具,它仍是依賴管理工具和項目管理工具,提供了中央倉庫,可以幫咱們自動下載構件。
四、爲了解決的依賴的增多,版本不一致,版本衝突,依賴臃腫等問題,它經過一個座標系統來精確地定位每個構件(artifact)。
五、還能幫助咱們分散在各個角落的項目信息,包括項目描述,開發者列表,版本控制系統,許可證,缺陷管理系統地址。
六、maven還爲全世界的java開發者提供了一個免費的中央倉庫,在其中幾乎能夠找到任何的流行開源軟件。經過衍生工具(Nexus),咱們還能對其進行快速搜索
七、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 都幫你實現了。
4、Maven怎麼用
二、建立 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 相似,但依賴於系統資源
三、發佈第三方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 ……
四、常使用 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 的文件。