什麼是Maven?
Maven 譯 ‘專家,行家’, 又是apache下的一個開源項目,相比于SVN(版本控制器)不同,他是一款項目管理工具,Maven也是由java編寫,是以同樣具有跨平台的特點,當然也就需要有JDK的環境支援.
Maven的作用
-
(1) 進行項目建構
①高度自動化,跨平台,标準化的 隻有遵守規範才能得到推廣
-
(2 依賴jar包管理
①開發一款項目不得不依賴第三方的jar包
-
(3) 依賴資訊管理
①自動生成項目資訊
為什麼要使用Maven
- 在原先的項目中,如果需要用到第三方的jar包,必須有開發人員手動去網上下載下傳(這就會導緻每個人下載下傳的版本不同,内容也可能不同),然後手動在 複制,粘貼到 WEB-INF/lib 下,而且是每一個項目都需要這樣,這樣導緻帶來了:同樣的jar出現在不同的工程中,浪費存儲空間,工程臃腫,而Maven就可以很好的解決這一問題,通過在pom.xml(POM 項目對象模型,可類比之前學過的DOM對象模型,這裡存放工程的核心配置)檔案中添加依賴引用倉庫中的jar來解決;
- Maven之是以能夠得到推廣,就是因為有一套規範,從中央倉庫下載下傳到本地倉庫的jar都是統一規範的,這樣就不會存在項目工程之間jar包沖突的問題。
- jar包之間的依賴管理會由Maven自動導入,比如 commons-fileupload.jar --> commons-io.jar在導入commons-fileupload.jar時,maven會幫我們自動導入commons-io.jar(這個我試的時候隻有高版本的jar會自動導入)
- 擁有生命周期(核心),簡化操作,高度自動化的展現。
Maven倉庫
- 本地倉庫
-
遠端倉庫
中央倉庫
鏡像倉庫
私服
大小排序: 中央>鏡像>私服>本地
通路速度排序:本地> 私服> 鏡像 >中央
本地倉庫位置
預設位置: ~/.m2/repository/
自定義位置:maven的本地倉庫配置到指定的路徑下,友善管理。在檔案conf–>settings.xml 下修改< localRepository >新的倉庫路徑< /localRepository >
Maven的目錄結構
Maven 的生命周期
Maven有三套互相獨立的聲明周期
-
Clean LifeCycle
進行真正構件之前進行一些清理工作
-
Default LifeCycle
構件的核心部分,編譯,測試,打包,部署等等
-
Site LifeCycle
生成項目報告,站點。
主要說一下Default 生命周期
其中選中的就是我們經常用到的階段,下面就以一個例子說明:
用Maven輸出HelloWorld!
注意: 執行mvn: 必須在pom.xml所在目錄中執行
按照Maven規範目錄将HelloWorld.java 和testHelloWprld.java放在正确的檔案夾下,然後從Dos指令裡面進入Maven項目:
mvn compile --隻編譯main目錄中的java檔案 ,編譯結束後會生成一個target檔案,存 放.class (第一次執行指令時,因為需要下載下傳執行該指令的基礎環境,是以會從中央倉庫下載下傳該環境到本地倉庫,時間很長,耐心等待,不要放棄)
mvn test 測試 同樣也需要下載下傳各種插件,生成.testClass檔案
mvn package 打成jar/war前提是:前面的步驟必須是成功的,(生命周期)
mvn install 将開發的子產品 放入本地倉庫,供其他子產品使用 (放入的位置 是通過gav決定)
mvn clean 删除target目錄(删除編譯檔案的目錄) 該指令既是最後一步,也是第一步。
mvn deploy 該指令是将項目釋出到私服上,供所有區域網路的人使用,但前提是必須配置好私服,這裡就不做展示了。
Maven 指令之是以能運作是因為有下面插件的支援。
Maven的依賴管理
依賴原則:為了防止沖突
a.路徑最短優先原則(很好了解,誰買東西會舍近求遠呢?)
b.路徑長度相同:
i.在同一個pom.xml檔案中有2個相同的依賴(覆寫):後面聲明的依賴 會覆寫前面聲明的依賴 (嚴禁使用本情況,嚴禁在同一個pom中聲明兩個版本不同的依賴)
ii.如果是不同的 pom.xml中有2個相同的依賴(優先):則先聲明的依賴 ,會覆寫後聲明的依賴
依賴管理的自動導入
依賴長度相同:
在Maven_HelloTime下檢視pom.xml
有些人奇怪的是 pom.xml中就沒沒有依賴junit的jar啊,為什麼會導入呢???
這就是依賴傳遞的範圍scope,隻有當scope為compile時,傳遞依賴才會生效
Maven的繼承
- 統一管理版本
- 消除重複
繼承實作步驟:
1.建立父工程: 父工程的打包方式為 pom
2.在父工程的pom.xml中編寫依賴:
< dependencyManagement >
< dependencies >
< dependency >
3.子類:
< !-- 給目前工程 繼承一個父工程:
1加入父工程坐标gav
2目前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑
–>
< parent>
<groupId>org.rjxy.maven</groupId>
<artifactId>B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../B/pom.xml</relativePath>
</parent>
4.在子類中 需要聲明 :使用那些父類的依賴
<!-- 聲明:需要使用到父類的junit (隻需要ga) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
Maven的聚合
使用聚合的原因
比如 Maven2 依賴于 Maven1,則在執行時:必須先将 Maven1 先加入到本地倉庫(install),之後才能執行Maven2,這點不符合Maven高度自動化的特點。
以上 前置工程的install操作,可以交由“聚合” 一次性搞定 一鍵安裝各個子產品到本地倉庫。。。
聚合的使用
聚合的配置
聚合的配置 隻能配置在(打包方式為pom)的Maven工程中