1. 什么是maven
- 翻譯為“專家”,“內行”
- Maven是跨平臺的項目管理工具。主要服務于基于Java平臺的項目構建,依賴管理和項目信息管理。
- 什么是理想的項目構建?
高度自動化,跨平臺,可重用的組件,標準化的 - 什么是依賴?為什么要進行依賴管理?
自動下載,統一依賴管理 - 有哪些項目信息?
項目名稱描述等,開發人員信息,開發者信息等 - 約定優于配置(convention over configuration)
2. 什么是構建
3. mavne模型
4. mavne的主要特點
- 擁有約定,知道你的代碼在哪里,放到哪里去
- 擁有一個生命周期,例如執行 mvn install 就可以自動執行編譯,測試,打包等構建過程
- 只需要定義一個pom.xml,然后把源碼放到默認的目錄,Maven幫你處理其他事情
- 擁有依賴管理,倉庫管理
5. maven安裝
- jdk安裝(根據maven版本選擇符合條件的jdk版本)
- 下載maven, 加壓下載文件, 配置MAVEN_HOME即可使用(類似jdk配置).
-
maven目錄介紹
maven解壓目錄
bin:含有mvn運行的腳本
boot:含有plexus-classworlds類加載器框架
conf:含有settings.xml配置文件
lib:含有Maven運行時所需要的java類庫
LICENSE.txt, NOTICE.txt, README.txt針對Maven版本,第三方軟件等簡要介紹
6. maven初始配置
- 設置MAVEN_HOME環境變量
升級時只需要下載最新版本,解壓縮后重新設置MAVEN_HOME環境變量即可 - 設置MAVEN_OPTS環境變量
-Xms128m -Xmx512m - 配置用戶范圍的settings.xml
MAVEN_HOME/conf/settings.xml 全局的
~/.m2/settings.xml
-默認倉庫:當前用戶路徑C:\Users[UserName].m2
-localRepository:用戶倉庫,用于檢索依賴包路徑 - 用戶Maven依賴包路徑層次目錄
依賴包路徑層次目錄
-settings.xml文件必須與maven安裝路徑下的內容保持一致
-settings.xml文件中設置路徑指向設定的倉庫目錄
<localRepository>D:\maven\repository</localRepository>
-因為maven的中心倉庫在國外,下載會很慢, 建議使用阿里云的maven倉庫-配置方式
注意:
用戶級別的倉庫在全局配置中一旦設置,全局配置將不再生效,轉用用戶所設置的倉庫,否則使用默認路徑倉庫.
7. maven項目約定
- src/main/java —— 存放項目的.java文件
- src/main/resources —— 存放項目資源文件,如spring, mybatis等配置文件
- src/test/java —— 存放所有測試.java文件,如JUnit測試類
- src/test/resources —— 測試資源文件
- target —— 項目輸出位置
- pom.xml——maven項目核心配置文件
8. maven核心概念
1.maven坐標
- 什么是坐標?
在平面幾何中坐標(x,y)可以標識平面中唯一的一點 - Maven坐標主要組成
groupId:定義當前Maven項目隸屬項目, 一般為公司域名反寫(com.taobao)
artifactId:定義實際項目中的一個模塊(testMaven)
version:定義當前項目的當前版本(1.1.0)
packaging:定義該項目的打包方式(jar,war,maven) - Maven為什么使用坐標?
-Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規范
-擁有了統一規范,就可以把查找工作交給機器
2.依賴管理-依賴范圍
2-1.傳遞性依賴
其中依賴范圍scope用來控制依賴和編譯,測試,運行的classpath的關系. 主要的是三種依賴關系如下:
1.compile: 默認編譯依賴范圍。對于編譯,測試,運行三種classpath都有效
2.test:測試依賴范圍。只對于測試classpath有效
3.provided:已提供依賴范圍。對于編譯,測試的classpath都有效,但對于運行無效。因為由容器已經提供,例如servlet-api.
4.runtime:運行時提供。面向接口編程時, 在編譯時期不需要知道具體的實現是誰, 所以編譯階段可以不需要具體的實現出現, 例如:jdbc驅動.
5.system 本地一些jar 例如短信jar
2-1-1.依賴管理-依賴范圍對傳遞依賴的影響:
2-2.可選依賴
<optional> true/false 是否向下傳遞
2-3.排除依賴
<exclusions>
<exclusion>
所包含坐標
排除依賴包中所包含的依賴關系
不需要添加版本,直接類別排除
3.依賴沖突
如果直接與間接依賴中包含有同一個坐標不同版本的資源依賴,以直接依賴的版本為準(就近[最短路徑]原則)
如果直接依賴中包含有同一個坐標不同版本的資源依賴,以配置順序下方的版本為準(加載先后原則)
9. 生命周期
- 何為生命周期?
-Maven生命周期就是為了對所有的構建過程進行抽象和統一
-包括項目清理,初始化,編譯,打包,測試,部署等幾乎所有構建步驟 - Maven有三套相互獨立的生命周期,請注意這里說的是“三套”,而且“相互獨立”,這三套生命周期分別是
Clean Lifecycle(清理項目): 在進行真正的構建之前進行一些清理工作。
Default Lifecycle(構建項目): 構建的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle: 生成項目報告,站點,發布站點。
再次強調一下它們是相互獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用site來生成站點。當然你也可以直接運行 mvn clean install site 運行所有這三套生命周期。
A Build Lifecycle is Made Up of Phases
A Build Phase is Made Up of Plugin Goals
2.1 clean生命周期:
clean生命周期每套生命周期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應于一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命周期的一個階段。有Clean生命周期,也有clean階段。Clean生命周期一共包含了三個階段:
pre-clean 執行一些需要在clean之前完成的工作
clean 移除所有上一次構建生成的文件(target文件)
post-clean 執行一些需要在clean之后立刻完成的工作
mvn clean 中的clean就是上面的clean,在一個生命周期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同于 mvn pre-clean clean,如果我們運行 mvn post-clean ,那么 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令行的輸入。
2.1 default生命周期:
default生命周期是Maven生命周期中最重要的一個,絕大部分工作都發生在這個生命周期中。這里,只解釋一些比較重要和常用的階段:
validate
generate-sources
process-sources
generate-resources
process-resources 復制并處理資源文件,至目標目錄,準備打包。
compile 編譯項目的源代碼。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 復制并處理資源文件,至目標測試目錄。
test-compile 編譯測試源代碼。
process-test-classes
test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
prepare-package
package 接受編譯好的代碼,打包成可發布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 將包安裝至本地倉庫,以讓其它項目依賴。
deploy 將最終的包復制到遠程的倉庫,以讓其它開發人員與項目共享。
運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是為什么我們運行mvn install 的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是完全依賴Maven的生命周期的,因此理解生命周期至關重要。
2.2 site生命周期:
pre-site 執行一些需要在生成站點文檔之前完成的工作
site 生成項目的站點文檔
post-site 執行一些需要在生成站點文檔之后完成的工作,并且為部署做準備
site-deploy 將生成的站點文檔部署到特定的服務器上
這里經常用到的是site階段和site-deploy階段,用以生成和發布Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。
-
常用命令:
a) compile
b) clean 刪除target/
c) test test case junit/testNG
d) package 打包
mvn clean package -U (強制拉一次)
e) install 把項目install到local repo
f) deploy 發本地jar發布到remote
10. 插件
- Maven的核心僅僅定義了抽象的生命周期,具體的任務都是交由插件完成的.
- 每個插件都能實現多個功能,每個功能就是一個插件目標
-
Maven的生命周期與插件目標相互綁定,以完成某個具體的構建任務
例如compile就是插件maven-compiler-plugin的一個插件目標
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar-no-fork</goal>
</goals>
<phase>verify</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
-
常用插件
1. 插件常用地址1
2. 插件常用地址2
3. findbugs 靜態代碼檢查
4. versions 統一升級版本號
mvn versions:set -DnewVersion=1.1
5. source 打包源代碼
6. assembly 打包zip、war
7. tomcat7 - maven插件開發
11. 繼承
- 何為繼承?
繼承為了消除重復,我們把很多相同的配置提取出來
例如:grouptId,version等
父工程設置為被繼承: <packaging>pom</packaging>
子工程繼承父工程:
省略父工程中定義的坐標除訪問名稱中的所有設定,添加繼承父工程
<parent>
<groupId>…</groupId>
<artifactId>… </artifactId>
<version>… </version>
<relativePath>../父工程項目名</relativePath>
</parent> - 父工程統一管理子工程依賴版本
<dependencyManagement>
<dependencies>
//添加公共依賴包
</dependencies>
</dependencyManagement>
1.只能出現在父pom
2.子工程僅僅添加依賴包,無需添加版本,版本由父工程繼承而來
3.為了進一步便于管理,將所有的版本管理設置在一起,設置為系統屬性值:
<properties>
<junit.version>4.9</junit.version>
……
</properties>
引用使用${junit.version}格式進行,只能在依賴范圍設置 - 父工程統一管理子工程依賴關系
如果所有子工程都需要依賴某些包,父工程可以通過設置依賴,將依賴關系傳遞到子工程中:
<dependencies>
//添加公共依賴包
</dependencies> - 總結:
1.dependencyManagement中定義的依賴子module不會共享
2.dependencies中定義的依賴子module可以共享
12. 聚合
- 何為聚合?
如果我們想一次構建多個項目模塊,那我們就需要對多個項目模塊進行聚合
<modules>
<module>../子項目名稱1</module>
<module>../子項目名稱2</module>
<module>../子項目名稱3</module>
</modules> - 聚合與繼承的關系
-聚合主要為了快速構建項目
-繼承主要為了消除重復
13. archetype模塊化
a) 生成一個archetype
i. mvn archetype:create-from-project
ii. cd /target/generated-sources/archetype
iii. mvn install
b) 從archetype創建項目 mvn archetype:generate -DarchetypeCatalog=local
14. 倉庫管理
- 何為Maven倉庫?
用來統一存儲所有Maven共享構建的位置就是倉庫 - Maven倉庫布局
-根據Maven坐標定義每個構建在倉庫中唯一存儲路徑
-大致為:groupId/artifactId/version/artifactId-version.packaging - 倉庫的分類
-本地倉庫:
~/.m2/repository/
每個用戶只有一個本地倉庫
-遠程倉庫
中央倉庫:Maven默認的遠程倉庫,不包含版權資源.
私服[Nexus]:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫
15. maven 排查命令
1. 查看項目maven依賴樹: mvn dependency:tree > a.txt
2. 查看系統變量: mvn help:system