本文主要介紹如下幾個部分:java
- 安裝目錄分析
- Maven 依賴
- 繼承和聚合
- 生命週期和插件
首先介紹一下Maven 名詞apache
- POM(Project Object Model)項目對象模型
- 座標:groupId , artifactId , version ,packaging,classifier
- Dependency
- Plug-in:Maven是有插件組織的,它的每個功能都是由插件提供的
- Repository:倉庫倉庫用來存放artifact的,能夠是本地倉庫,也能夠是遠程倉庫
- Snapshot:快照 工程正在處於開發階段
安裝目錄分析框架
bin:包含了mvn運行的腳本;這些腳本用來配置Java命令,準備好classpath和相關的java系統屬性,而後執行java命令maven
boot:包含一個類加載器框架,maven 使用它加載本身的類庫ide
conf:settings.xml 在機器上全局配額maven的行爲測試
lib:maven 運行時須要的java 類庫;網站
~/.m2 默認只有repository 倉庫文件,通常用戶都會複製settings.xml 過來;spa
Maven 依賴插件
1、Maven依賴配置命令行
- groupId , artifactId , version 基本座標
- Type 依賴的類型,默認是jar
- Scope 依賴範圍( compile , test, provided, runtime, system )
- Optional 標記依賴是否可選
- Exclusions 用來排除傳遞的依賴
2、Maven 依賴範圍
1. compile :編譯依賴範圍。 編譯,測試,運行都有效,默認的選擇
2. test : 測試依賴範圍。測試有效,例如junit
3. provided : 已提依賴範圍。編譯,測試有效,例如 servlet ,運行時容器會提供實現
4. runtime :運行時依賴範圍。 運行和測試有效,例如 jdbc,編譯時只需相應的接口,測試和運行時才須要具體的實現
5. system :系統依賴範圍。 編譯,測試有效。使用此範圍的依賴必須經過systemPath元素顯式的指定依賴文件,於是
此類依賴是不經過Maven倉庫解析的,通常適合於本機測試環境下,依賴本地起的服務。
編譯、測試、運行 各自使用一套classpath,
依賴範圍就是用來控制依賴與這三種classpath的關係
3、傳遞性依賴
- 假設A依賴於B,B依賴於C,咱們說A對於B是第一直接依賴,B對於C是第二直接依賴,A對於C是傳遞性依賴。
- 表格的第一列是B在A中的依賴範圍,第一行是C在B中的依賴範圍,交叉的格子是C在A中的依賴範圍
![](http://static.javashuo.com/static/loading.gif)
4、依賴調解
5、依賴歸類
![](http://static.javashuo.com/static/loading.gif)
Maven 繼承和聚合
1、繼承
- dependencies即便在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(所有繼承)
- dependencyManagement裏只是聲明依賴,並不實現引入,所以子項目須要顯式的聲明須要用的依賴。若是不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,而且沒有指定具體版本,纔會從父項目中繼承該項,而且version和scope都讀取自父pom;另外若是子項目中指定了版本號,那麼會使用子項目中指定的jar版本。
2、聚合
- 方便快速構建
- 一個命令構建多個模塊, 須要額外建立一個模塊,而後經過該模塊構建整個項目的全部模塊
![](http://static.javashuo.com/static/loading.gif)
生命週期和插件
- Maven的生命週期就是爲了對全部的構建過程進行抽象和統一;編譯、測試、打包、集成測試、驗證、部署和站點的生成都能映射到一個生命週期上;
- 生命週期是抽象的,不作任何實際的工做(如編譯源代碼),實際任務都交由插件來完成。每一個構建步驟均可以綁定一個或多個插件行爲;
1、三套生命週期
- Clean Lifecycle 在進行真正的構建以前進行一些清理工做。
- Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
- Site Lifecycle 生成項目報告,站點,發佈站點。
一、Clean Lifecycle
![](http://static.javashuo.com/static/loading.gif)
二、Default生命週期
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
三、Site生命週期
![](http://static.javashuo.com/static/loading.gif)
2、命令行和生命週期
- 從命令行執行maven 任務主要就是調用maven 的生命週期階段;
- 各個生命週期相互獨立,一個生命週期的階段是有先後依賴的
- 若是要同時執行多個生命週期的階段可在命令行輸入多個命令,中間以空格隔開
- mvn clean ; mvn test; mvn clean install ;
- mvn clean deploy site-deploy
3、插件
- Maven生命週期與插件相互綁定,來完成實際的構建任務好比:編譯這一任務,它對應了default生命週期的compile這一階段,而maven-compiler-plugin 這一插件的compile的這一目標可以完成任務;
- 一個插件包含多個功能,每一個功能就是一個插件目標;
一、內置綁定
![](http://static.javashuo.com/static/loading.gif)
default 生命週期階段與插件目標的綁定關係圖:
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
二、自定義綁定
一個常見的例子是建立項目的源碼jar包。內置的插件綁定關係中沒有涉及這一任務,所以須要用戶自行配置。maven-source-plugin能夠幫助咱們完成該任務,它的jar-no-fork目標可以將項目的主代碼打包成jar文件,能夠將其綁定到default生命週期的verify階段上,在執行完集成測試後和安裝構件以前建立源碼jar包。具體配置見下
![](http://static.javashuo.com/static/loading.gif)
三、插件配置
- 用戶能夠配置插件目標參數,調整插件目標來執行任務;
- 命令行插件配置
- 使用語法:
- maven命令 -D參數=參數值
- 好比:mvn install -Dmaven.test.skip=true,其中maven命令爲install,參數爲maven.test.skip,參數值爲true,
四、pom中插件全局配置
![](http://static.javashuo.com/static/loading.gif)
五、獲取插件信息
- 在線插件信息 http://maven.apache.org/plugins/
- 使用maven-help-plugin 描述插件
- 能夠運行以下命令來獲取maven-compiler-plugin2.1版本的信息:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
六、從命令行調用插件
- 除了mvn命令激活生命週期階段從而執行綁定的插件目標外,還支持直接從命令行調用插件目標;
- mvn help:describe-Dplugin=complier
- mvn dependency:tree
- help 是maven-help-plugin的目標前綴;
- dependency是maven-dependency-plugin的目標前綴
七、經常使用Maven插件
- maven-archetype-plugin 項目的骨架
- maven-dependency-plugin最大的用途是幫助分析項目依賴,dependency:list可以列出項目最終解析到的依賴列表,dependency:tree能進一步的描繪項目依賴樹,dependency:analyze能夠告訴你項目依賴潛在的問題
- maven-enforcer-plugin建一系列規則強制你們遵照,包括設定Java版本、設定Maven版本、禁止某些依賴、禁止 SNAPSHOT依賴
- maven-help-plugin
網站支持