歡迎你們前來白嫖PDF。下圖回覆:666html
本教程致力於最實用教程,個別圖片粘貼有丟失,還有來領取原版。java
聲明:參考來源互聯網,有任何爭議能夠留言。站在前人的肩上,咱們才能看的更遠。web
本教程純手打,致力於最實用教程,不須要什麼獎勵,只但願多多轉發支持。
歡迎來我公衆號,但願能夠結識你,也能夠催更,微信搜索:JavaPubspring
有任何問題均可以來談談,等你哦!apache
我搞Java也有段時間了,對maven的理解停留在能管理依賴、做爲倉庫使用,那它還能幹什麼?api
我前面發過一些實戰項目,不少初學者和愛好者都有用到,可是對其中maven不瞭解,不知道如何部署。應一位fans同窗要求,redert肝一篇maven,各位看官。bash
1.什麼是Maven?這是一篇文檔型文章,能對maven有一個完整的瞭解。服務器
搞Java都能說出,maven是什麼,他都能回答出maven是一個項目管理工具
,這篇文章學習再來一塊兒學習。微信
Maven是基於項目對象模型(POM Project Object Model),能夠經過一小段描述信息(配置文件)來管理項目的構建、報告和文檔的軟件項目管理工具。markdown
其官網地址爲:http://maven.apache.org
Maven翻譯爲「專家」、「內行」;是一個採用純Java編寫的開源項目管理工具,Maven採用了一種被稱之爲Project Object Model (POM)概念來管理項目,全部的項目配置信息都被定義在一個叫作POM.xml的文件中, 經過該文件Maven能夠管理項目的整個聲明週期,包括清除、編譯、測試、報告、打包、部署等。目前Apache下絕大多數項目都已經採用Maven進行管理. 而Maven自己還支持多種插件,能夠方便更靈活的控制項目, 開發人員的主要任務應該是關注業務邏輯並去實現它,而不是把時間浪費在學習如何在不一樣的環境中去依賴jar包、項目部署等。Maven正是爲了將開發人員從這些任務中解脫出來而誕生的一個項目管理工具。
2.maven的做用Maven是跨平臺的項目管理工具。主要服務於基於Java平臺的項目構建,依賴管理和項目信息管理。
高度自動化,跨平臺,可重用的組件,標準化的
自動下載,統一依賴管理
項目名稱描述,開發人員信息等
下面這幾個痛點,相信是每一個Java攻城獅都遇到過的。
傳統方式管理jar依賴的問題:
jar衝突
jar依賴
jar體積過大
jar在不一樣階段沒法個性化配置
使用maven方式管理jar依賴的好處:
解決jar衝突
解決jar依賴問題
jar文件不用在每一個項目保存,只須要放在倉庫便可
maven能夠指定jar的依賴範圍
如今爲止應該沒有使用jdk1.7如下的吧,若是有,這篇文章能夠跳過。
1. 下載Maven
下載地址:http://maven.apache.org/download.cgi
2. 解壓文件
解壓maven壓縮包「apache-maven-3.5.2.bin.zip」到一個路徑(儘可能編碼路徑中不要包含中文)
1. 添加環境變量MAVEN_HOME
MAVEN_HOME : E:\maven\apache-maven-3.5.2-bin(注意:配置爲你本身的maven路徑)
MAVEN_OPTS : -Xms256m -Xmx512m(注意:能夠不配置
)
2. 設置系統環境變量path
在Path中追加: %MAVEN_HOME%\bin
3. 驗證成功
打開 cmd 輸入:mvn -version
4. 配置本地倉庫
Maven的默認本地倉庫在:${user.home}/.m2/repository;這地址能夠在settings.xml中修改指定自定義的倉庫路徑。
【自定義倉庫路徑】
找到${maven_home}/conf/settings.xml文件,修改以下:
須要注意的是上圖中的自定義路徑必須存在。repository是本地倉庫,也即本地下載的jar存放路徑。
4.maven項目規約到這裏爲止,你的項目已經能夠打包、部署,作一些簡單操做了。
這是一套科學的約定,使用它
什麼是Maven項目規約?其實就是maven項目的目錄結構。
maven項目的目錄結構遵照如下規範:
下面經過maven命令,快速構建一個java項目結構。
在命令行中能夠經過Maven中的命令(插件)能夠自動建立文件結構和自動生成pom.xml文件。
打開cmd,執行如下cmd命令:
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.yiidian -DartifactId=hellojava -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot
執行後結果:
參數說明: #核心命令 mvn 框架:生成 即生成Maven項目最基本的目錄結構 mvn archetype:generate #讀取archetype-catalog.xml文件的位置;內置的 -DarchetypeCatalog=internal #公司域名倒寫 -DgroupId=com.yiidian #項目名稱 -DartifactId=hellojava #Maven項目的模板;最簡單的Maven項目模板 -DarchetypeArtifactId=maven-archetype-quickstart #項目版本號,snapshot 內測版,release 正式發行版 -Dversion=0.0.1-snapshot
建立web項目時,不但建立目錄結構和pom.xml,並建立webapp目錄放置web資源文件。
執行如下cmd命令:
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.yiidian -DartifactId=helloweb -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot
執行後結果:
參數說明: #核心命令 mvn 框架:生成 即生成Maven項目最基本的目錄結構 mvn archetype:generate #讀取archetype-catalog.xml文件的位置;內置的 -DarchetypeCatalog=internal #公司域名倒寫 -DgroupId=com.yiidian #項目名稱 -DartifactId=helloweb #Maven項目的模板;Maven web項目模板 -DarchetypeArtifactId=maven-archetype-webapp #項目版本號 -Dversion=0.0.1-snapshot
注意:進入項目後再操做
mvn clean
清除原來的編譯結果
mvn compile
編譯
mvn test
運行測試代碼;mvn test -Dtest=類名//單獨運行測試類
mvn package
打包項目;mvn package -Dmanven.test.skip=true//打包時不執行測試
mvn install
將項目打包並安裝到本地倉庫
mvn deploy
發佈到本地倉庫或者服務器
我經常使用的打包命令:
mvn clean install -DskipTests
6.什麼是倉庫?
瞭解內容,可跳過
Maven在某個統一的位置存儲全部項目的共享的構件,這個統一的位置,就稱之爲倉庫。(倉庫就是存放依賴和插件的地方)Maven的倉庫有兩大類:
本地倉庫
遠程倉庫,在遠程倉庫中又分紅了3種:中央倉庫、私服、其它公共庫。
本地倉庫:就是Maven在本機存儲構件的地方。maven的本地倉庫,在安裝maven後並不會建立,它是在第一次執行maven命令的時候才被建立。maven本地倉庫的默認位置:在用戶的目錄下都只有一個.m2/repository/的倉庫目錄;能夠修改。
中央倉庫:包含了絕大多數流行的開源Java構件,以及源碼、做者信息、SCM、信息、許可證信息等。開源的Java項目依賴的構件均可以在這裏下載到。
中央倉庫的地址:http://repo1.maven.org/maven2/
私服:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫。
沒有使用私服的倉庫構件下載
使用私服的倉庫構件下載
在平面幾何中座標(x,y)能夠標識平面中惟一的一點。
Maven爲何使用座標?
Maven世界擁有大量構件,須要找一個用來惟一標識一個構建的統一規範
擁有了統一規範,就能夠把查找工做交給機器
如何獲取Maven座標
推薦一個Maven座標查詢網站:http://mvnrepository.com/
網站上能夠搜索具體的組織或項目關鍵字,以後複製對應的座標到pom.xml中。如:
參考:http://www.yiidian.com/maven/maven-dependence.html
依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係。具體的依賴範圍有以下6種:
下面是爲了解決衝突依賴內容,若是你在寫一個Demo,可做爲了解部份。
假設 C 依賴 B , B 依賴 A ,那麼稱 C 對 B 是第一直接依賴, B 對 A 是第二直接依賴, C 對 A 是傳遞依賴。
對於傳遞性依賴,依賴的範圍以下表:
在依賴節點dependency中的能夠控制當前的依賴是否向下傳遞;默認值爲false,表示向下傳遞。
【示例】A項目依賴於log4j,而後B項目依賴於A項目;那麼若是在A中對log4j依賴的optional配置成false時,B項目中自動傳遞依賴於log4j。不然反之。
1)項目A配置slf4j的依賴並設置optional爲true
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> <!-- 配置爲true時不向下傳遞此依賴,默認爲false --> <optional>true</optional> </dependency>
2)配置項目B依賴於項目A,檢查項目B的依賴包
<!-- 依賴於A --> <dependency> <groupId>com.JavaPub</groupId> <artifactId>A</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
這時發現B項目沒有依賴slf4j-log4j12
依賴衝突是很常見的問題
最終A依賴的X的版本爲2.0
【好比】:項目A中,依賴了slf4j1.6.4版本的包,經過slf4j1.6.4間接依賴log4j1.2.16版本;若是項目A中直接配置了log4j 1.2.17版本,那麼最終的版本爲1.2.17。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> <!-- 配置爲true時不向下傳遞此依賴,默認爲false --> <optional>true</optional> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
若是間接依賴中包含有同一個座標不一樣版本的資源依賴,以配置順序上方的版本爲準
以下對應spring-core的間接依賴的版本號,以struts2-spring-plugin爲準
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.0.RELEASE</version> </dependency>
這個在項目中使用頻率較高
在pom中的依賴節點中,若是引入的依賴包含了不少其它的傳遞依賴,並且項目須要的這些依賴的版本和傳遞依賴的不相符;那麼能夠在依賴節點中設置排除依賴節點: 而後再添加 ,其裏面的內容包括:
①所包含座標
②排除依賴包中所包含的依賴關係
【注意】不須要添加版本,直接按照類別排除
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24.1</version> <exclusions> <!-- 排除spring-core的傳遞依賴 --> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <eclusion> <exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.0.RELEASE</version> </dependency>9.maven生命週期
Maven生命週期就是爲了對全部的構建過程進行抽象和統一;包括項目清理,初始化,編譯,打包,測試,部署等幾乎全部構建步驟。
Maven有三套相互獨立的生命週期,請注意這裏說的是「三套」,並且「相互獨立」,這三套生命週期分別是:
再次強調它們是相互獨立的,能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點。不過也能夠直接運行 mvn clean install site 運行全部這三套生命週期。
clean生命週期每套生命週期都由一組階段(Phase)組成,咱們平時在命令行輸入的命令總會對應於一個特定的階段。好比,運行mvn clean ,這個的clean是clean生命週期的一個階段。有clean生命週期,也有clean階段。clean生命週期一共包含了三個階段:
mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它以前的全部階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean ,若是咱們運行 mvn post-clean ,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,能夠大大簡化命令行的輸入。
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的生命週期的。
site生命週期包含以下4個階段:
這裏常常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這是Maven至關強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。
10.maven插件使用參考:http://www.yiidian.com/maven/maven-plugins.html
11.maven繼承與聚合繼承爲了消除重複,能夠把pom中不少相同的配置提取出來;如:grouptId,version等。在使用的時候子工程直接繼承父工程的依賴版本號,子工程中再也不須要指定具體版本號,方便統一管控項目的依賴版本問題。
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.sm1234</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!-- 集中定義依賴版本號 --> <properties> <junit.version>4.10</junit.version> <spring.version>4.1.0.RELEASE</spring.version> <slf4j.version>1.6.4</slf4j.version> </properties> <!-- 版本鎖定,當子工程中有須要而且自行添加了具體依賴後纔有效 --> <dependencyManagement> <dependencies> <!-- 單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
在子工程中的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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 父工程 --> <parent> <groupId>cn.sm1234</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 父項目的pom.xml文件的相對路徑;通常可不指定 --> <relativePath>../parent</relativePath> </parent> <groupId>cn.sm1234</groupId> <artifactId>sm1234-C</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 依賴 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- 版本號由父工程裏面統一指定再也不須要特別指定 --> <!-- <version>${junit.version}</version> --> <scope>test</scope> </dependency> </dependencies> </project>
relativePath:父項目的pom.xml文件的相對路徑。默認值爲…/pom.xml。maven首先從當前構建項目開始查找父項目的pom文件,而後從本地倉庫,最後從遠程倉庫。RelativePath容許你選擇一個不一樣的位置;通常Eclipse找不到parent項目時能夠先update project,還不行則可配置此項。
多模塊項目是如今開發中比較經常使用的方式。
若是想一次構建多個項目模塊,那則須要對多個項目模塊進行聚合。
<modules> <module>../子項目名稱1</module> <module>../子項目名稱2</module> <module>../子項目名稱3</module> </modules>12.maven搭建SSH項目實戰
很實用,推薦閱讀
參考:http://www.yiidian.com/maven/maven-ssh-project.html