rodert教你學Maven-實戰這一篇就夠了

歡迎你們前來白嫖PDF。下圖回覆:666html

本教程致力於最實用教程,個別圖片粘貼有丟失,還有來領取原版。java

在這裏插入圖片描述

前言

聲明:參考來源互聯網,有任何爭議能夠留言。站在前人的肩上,咱們才能看的更遠。web

本教程純手打,致力於最實用教程,不須要什麼獎勵,只但願多多轉發支持。
歡迎來我公衆號,但願能夠結識你,也能夠催更,微信搜索:JavaPubspring

有任何問題均可以來談談,等你哦!apache

在這裏插入圖片描述

我搞Java也有段時間了,對maven的理解停留在能管理依賴、做爲倉庫使用,那它還能幹什麼?api

我前面發過一些實戰項目,不少初學者和愛好者都有用到,可是對其中maven不瞭解,不知道如何部署。應一位fans同窗要求,redert肝一篇maven,各位看官。bash

這是一篇文檔型文章,能對maven有一個完整的瞭解。服務器

1.什麼是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的做用

2.1.Maven的功能

Maven是跨平臺的項目管理工具。主要服務於基於Java平臺的項目構建,依賴管理和項目信息管理。

  • 什麼是項目構建?

在這裏插入圖片描述

  • 什麼是理想的項目構建?

高度自動化,跨平臺,可重用的組件,標準化的

  • 什麼是依賴?爲何要進行依賴管理?

自動下載,統一依賴管理

  • 有哪些項目信息?

項目名稱描述,開發人員信息等

2.2.爲何使用maven

下面這幾個痛點,相信是每一個Java攻城獅都遇到過的。

傳統方式管理jar依賴的問題:

jar衝突
jar依賴
jar體積過大
jar在不一樣階段沒法個性化配置

使用maven方式管理jar依賴的好處:

解決jar衝突
解決jar依賴問題
jar文件不用在每一個項目保存,只須要放在倉庫便可
maven能夠指定jar的依賴範圍

3.maven安裝和配置

3.1.安裝

如今爲止應該沒有使用jdk1.7如下的吧,若是有,這篇文章能夠跳過。

1. 下載Maven

下載地址:http://maven.apache.org/download.cgi

在這裏插入圖片描述

2. 解壓文件

解壓maven壓縮包「apache-maven-3.5.2.bin.zip」到一個路徑(儘可能編碼路徑中不要包含中文)

在這裏插入圖片描述

  • bin:含有mvn運行的腳本
  • boot:含有plexus-classworlds類加載器框架
  • lib:含有Maven運行時所須要的java類庫
  • conf:含有settings.xml配置文件
  • settings.xml 中默認的用戶庫: ${user.home}/.m2/repository[經過- maven下載的jar包都會存儲到此倉庫中]

3.2.配置

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項目的目錄結構遵照如下規範:

在這裏插入圖片描述

5.命令行構建maven項目

5.1.命令行構建Java項目

下面經過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

5.2.使用命令行建立web項目

建立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

5.3.構建Maven項目命令的使用

注意:進入項目後再操做

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/

私服:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫。

沒有使用私服的倉庫構件下載

在這裏插入圖片描述

使用私服的倉庫構件下載

在這裏插入圖片描述

7.什麼是maven座標?

在平面幾何中座標(x,y)能夠標識平面中惟一的一點。

  • Maven座標主要組成
    groupId:定義當前Maven項目隸屬項目、組織
    artifactId:定義實際項目中的一個模塊
    version:定義當前項目的當前版本
    packaging:定義該項目的打包方式(pom/jar/war,默認爲jar)
    groupId、artifactId、version簡稱爲GAV。

Maven爲何使用座標?

Maven世界擁有大量構件,須要找一個用來惟一標識一個構建的統一規範
擁有了統一規範,就能夠把查找工做交給機器

如何獲取Maven座標

推薦一個Maven座標查詢網站:http://mvnrepository.com/

網站上能夠搜索具體的組織或項目關鍵字,以後複製對應的座標到pom.xml中。如:

在這裏插入圖片描述

8.maven依賴管理

8.1.依賴範圍

參考:http://www.yiidian.com/maven/maven-dependence.html

依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係。具體的依賴範圍有以下6種:

  1. compile: 默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效
  2. test:測試依賴範圍。只對於測試classpath有效
  3. provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。由於由容器已經提供,例如servlet-api
  4. runtime:運行時提供。例如:jdbc驅動
  5. system:系統範圍,自定義構件,指定systemPath;跟provided 類似,可是在系統中要之外部JAR包的形式提供,maven不會在repository查找它。
  6. import:只使用在中,表示從其它的pom中導入dependency的配置。

在這裏插入圖片描述

下面是爲了解決衝突依賴內容,若是你在寫一個Demo,可做爲了解部份。

8.2.傳遞性依賴

假設 C 依賴 B , B 依賴 A ,那麼稱 C 對 B 是第一直接依賴, B 對 A 是第二直接依賴, C 對 A 是傳遞依賴。

對於傳遞性依賴,依賴的範圍以下表:

在這裏插入圖片描述

8.3.可選依賴

在依賴節點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

8.4.依賴衝突

依賴衝突是很常見的問題

  • 若是直接與間接依賴中包含有同一個座標不一樣版本的資源依賴,以直接依賴的版本爲準(就近原則)

在這裏插入圖片描述

最終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>

8.4.排除依賴

這個在項目中使用頻率較高

在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生命週期

9.1.Maven生命週期

Maven生命週期就是爲了對全部的構建過程進行抽象和統一;包括項目清理,初始化,編譯,打包,測試,部署等幾乎全部構建步驟。
Maven有三套相互獨立的生命週期,請注意這裏說的是「三套」,並且「相互獨立」,這三套生命週期分別是:

  • Clean Lifecycle 在進行真正的構建以前進行一些清理工做。
  • Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
  • Site Lifecycle 生成項目報告,站點,發佈站點。

再次強調它們是相互獨立的,能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點。不過也能夠直接運行 mvn clean install site 運行全部這三套生命週期。

9.2.clean生命週期

clean生命週期每套生命週期都由一組階段(Phase)組成,咱們平時在命令行輸入的命令總會對應於一個特定的階段。好比,運行mvn clean ,這個的clean是clean生命週期的一個階段。有clean生命週期,也有clean階段。clean生命週期一共包含了三個階段:

  • pre-clean 執行一些須要在clean以前完成的工做
  • clean 移除全部上一次構建生成的文件
  • post-clean 執行一些須要在clean以後馬上完成的工做

mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它以前的全部階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean ,若是咱們運行 mvn post-clean ,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,能夠大大簡化命令行的輸入。

9.3.default生命週期

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的生命週期的。

9.4.site生命週期

site生命週期包含以下4個階段:

  • pre-site 執行一些須要在生成站點文檔以前完成的工做
  • site 生成項目的站點文檔
  • post-site 執行一些須要在生成站點文檔以後完成的工做,而且爲部署作準備
  • site-deploy 將生成的站點文檔部署到特定的服務器上

這裏常常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這是Maven至關強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。

10.maven插件使用

參考:http://www.yiidian.com/maven/maven-plugins.html

11.maven繼承與聚合

11.1.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,還不行則可配置此項。

11.2.聚合

多模塊項目是如今開發中比較經常使用的方式。

若是想一次構建多個項目模塊,那則須要對多個項目模塊進行聚合。

<modules>
	<module>../子項目名稱1</module>
	<module>../子項目名稱2</module>
	<module>../子項目名稱3</module>
</modules>
12.maven搭建SSH項目實戰

很實用,推薦閱讀

參考:http://www.yiidian.com/maven/maven-ssh-project.html

相關文章
相關標籤/搜索