本文原先發表與博客園(http://www.cnblogs.com/libingbin/p/6104588.html ),不過個人博客園已經再也不更新了,原有博文會逐步遷移的。html
聽說半夜喝咖啡敲出來的代碼,有一種淡淡的咖啡味道;那半夜寫出來的總結,是否是也會有一種夜晚的寧靜呢!今晚夜深人靜,就給後生們總結總結Maven吧!畢竟,今天搞J2E的工程師若是不會或不知道Maven,那就在圈子裏尷尬了。Maven是一個採用純Java編寫的開源項目管理工具。Maven採用了一種被稱之爲project object model (POM)概念來管理項目,全部的項目配置信息都被定義在一個叫作POM.xml的文件中,經過該文件,Maven能夠管理項目的整個聲明週期,包括編譯,構建,測試,發佈,報告等等。目前Apache下絕大多數項目都已經採用Maven進行管理。而Maven自己還支持多種插件,能夠方便更靈活的控制項目。一句話:Maven是一個項目管理和構建工具,主要作編譯、測試、報告、打包、部署等操做完成項目的構建。web
Maven能幹嗎呢?spring
1.項目自動化編譯部署:apache
2.項目jar包的依賴管理:api
3.企業開發分包分模塊部署:框架
首先,確定是官網看看(https://maven.apache.org)嘍!jsp
2. 將下載好的maven(壓縮版的)進行解壓/並拷貝本身的開發目錄maven
3. 設置系統環境變量
設置Maven_HOME(例如:D:\dev\maven3.3.9)
設置PATH(例如:%MAVEN_HOME%\bin)ide
4. mvn -v 檢查是否安裝成功工具
5. maven倉庫的定位
1. 配置用戶範圍的settings.xml(MAVEN_HOME/conf/settings.xml拷貝至C:\Users\admin.m2目錄下)
2. 打開settings.xml文件將倉庫路徑修改(打開復制好的文件並修改裏面的節點內容,指定本身的本地庫。見下圖:)
6. Maven遵循約定優於配置的原則(有約定好的默認值和目錄機構、框架基礎)
項目輸出位置
首次運行mvn compile會看到奇怪的下載內容。。。。。。???
爲了保證Maven順利運行,會從遠程倉庫下載部分jar包到本地庫, 本地庫地址就是你本身配置的MAVEN_HOME/conf/settings.xml文件裏面的內容
當你第一次運行 maven 的時候,它會從網上的 maven 庫 (repository) 下載須要的程序, 存放在你電腦的本地庫 (local repository) 中,因此這個時候你須要有 Internet 鏈接。
Maven 默認的本地庫是 ~/.m2/repository/ ,
在 Windows 下是 %USER_HOME%.m2\repository\
9. 項目單元測試的編譯:mvn test
10. 打包(生成target目錄,編譯、測試代碼,生成測試報告,生成jar/war文件):mvn package
11. 發佈項目提交到本地倉庫:mvn install
12. Maven的生命週期
完整的項目構建過程一般包括清理、編譯、測試、打包、集成測試、驗證、部署等步驟,Maven從中抽取了一套完善的、易擴展的生命週期。Maven的生命週期是抽象的,其中的具體任務都交由插件來完成。
定位:C:\Users\~.m2\repository\org\apache\maven\plugins
2. 生命週期階段與插件關係
Maven 的生命週期是抽象的,實際須要插件來完成任務。 這一過程是經過將插件的目標(goal)綁定到生命週期的具體階段(phase)來完成的。 如:將 maven-compiler-plugin插件的compile目標綁定到default生命週期的compile階段,完成項目的源代碼編譯
3. maven的內置插件
咱們在執行maven命令的時候 mvn clean compile package等, maven會經過本身內置插件幫咱們執行項目的清理/編譯/打包工做, 這些也是經過maven的內置插件實現的
packageing:定義打包方式,默認jar包,若是是web項目是war包
本地庫
1. ~/.m2/settings.xml/該文件裏面的配置
2. 每一個用戶只有一個本地倉庫
遠程庫
1. 中央庫:Maven默認的遠程倉庫,http://search.maven.org/
2. 私服庫:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫(例如使用Sonatype Nexus搭建Maven私服 )
鏡像庫
1. 用來替代中央倉庫,速度通常比中央倉庫快
基本概念:
依賴關係列表(dependency list)是POM的重要部分,也就是咱們項目對jar包的管理
jar包去哪找?
http://mvnrepository.org/
http://search.maven.org/
http://maven.outofmemory.cn/
jar如何添?
示例以下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
</dependencies>
依賴傳遞
最短路徑:路徑最近者優先(只會選擇路徑最短的一個,不會兩個都下載,否則就是jar包衝突,
實際開發中,maven本身搞定,咱們只須要了解
)
最早申明:路徑相同者POM文件裏面的,第一聲明者優先
依賴引用
說白了,就是須要maven2工程裏面能夠引入maven1工程,
1) maven1能夠做爲jar包發佈到本地庫
針對maven1的pom.xml運行 mvn install
2) 讓maven2的pom.xml裏面引用maven1,做爲jar包填入。
引用maven1的jar包
<dependency>
<groupId>com.****.p2p</groupId>
<artifactId>maven1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
依賴排除
引用工程之間有一樣功能的jar包,也即jar包重複,如何破?
新建新工程maven2:
1. 依賴排除,去重複
<dependency>
<groupId>com.atguigu.crm</groupId>
<artifactId>maven1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions><!-- 依賴排除 -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>
2. jar包重複狀況
1 好比Maven02自引用了 <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.2</version> </dependency> 2 Maven03又引用了Maven02+commons-logging-1.1.1.jar 3 問題:commons-logging1.1.2和commons-logging1.1.1會衝突
4 用到了那個?mavne03如何作出選擇?咱們如何手工排除? 4.1 用到了1.1.1 4.2 依據是最短路徑 4.3 假如不想用maven02工程的1.1.2,須要在引用包裏面添加
依賴範圍
maven在構建過程有3套classpath,咱們會根據配置依賴的範圍依賴不一樣的classpath:
compile:默認是compile,對 編譯+測試+運行 都有效
provided:對編譯和測試,運行的時候不須要加入(例如 jsp 依賴 searvlet api ,好比咱們在編譯和測試的時候有效可是在運行的時候容器已經提供servletapi,若是加入會形成衝突)
runtime:只在測試和運行時 有效,比較典型的例子 jdbc api,只有在啓動代碼測試或者運行的時候纔會啓用
聚合模塊爲項目目錄的最頂層,其餘模塊做爲聚合模塊子目錄而存在。目的是爲一次性批處理各個模塊構建多個項目模塊。
aggregation聚合,Modules快速構建
創建整體的聚合工程
聚合pom.xml (切記:<packaging>pom</packaging>)
統一執行聚合工程的pom.xml
生產真實項目maven構建介紹
pom繼承是爲了抽出重複配置,一般配置在父模塊中,爲子模塊提供使用,這樣能夠作到「一處聲明,到處使用」。
Parent繼承,消除重複配置 創建整體的父類繼承工程 繼承pom.xml,父類定義+子類引用
前提是你的IntelliJ IDEA已經配置好maven了哦!
接下來,建立過程如圖所示:
本文爲博主原創文章,轉載請註明出處!