Maven
1、學習目標
-
會使用maven構建專案的命令
-
會使用maven構建java專案和java web專案
-
依賴管理--傳遞依賴 版本衝突處理
-
在web的單個工程中實現jsp+servlet整合。
-
分模組構建工程
-
會向私服上傳jar包。會從私服下載jar包
2、Maven介紹
2.1 maven是什麼
-
maven翻譯為“專家”,“內行”。
-
Maven是Apache下的一個純java開發的開源專案,它是一個專案管理工具,使用maven對java專案進行構建、依賴管理。當前使用Maven的專案在持續增長。
2.2 什麼是專案構建
-
專案構建是一個專案從編寫原始碼到編譯、測試、執行、打包、部署、執行的過程
2.3 構建過程
2.3.1 傳統專案構建過程
-
傳統的使用eclipse構建專案的過程如下:
2.3.2 maven專案構建過程
-
maven將專案構建的過程進行標準化,每個階段使用一個命令完成,下圖展示了構建過程的一些階段,後面章節詳 細介紹每個階段,這裡先大概瞭解下:
-
清理 mvn clean
-
編譯 mvn compile
-
測試 mvn test
-
報告 mvn site
-
打包 mvn package
-
部署 mvn deploy
2.4 jar依賴管理
2.4.1 傳統專案的依賴管理
-
傳統的專案工程要管理所依賴的jar包完全靠人工進行,程式設計師從網上下載jar包新增到專案工程中,如下圖:程式 員手工將Spring、SpringMVC、Mybatis的jar新增到工程中的WEB-INF/lib目錄下。
手工拷貝jar包新增到工程中的問題是:
-
沒有對jar包的版本統一管理,容易導致版本衝突。
-
從網上找jar包非常不方便,有些jar找不到。
-
jar包新增到工程中導致工程過大。
2.4.2 maven專案的依賴管理
-
maven專案管理所依賴的jar包不需要手動向工程新增jar包,只需要在pom.xml(maven工程的配置檔案)新增jar
-
包的座標,自動從maven倉庫中下載jar包、執行,如下圖:
使用maven依賴管理新增jar的好處:
-
通過pom.xml檔案對jar包的版本進行統一管理,可避免版本衝突。
-
maven團隊維護了一個非常全的maven倉庫,裡邊包括了當前使用的jar包,maven工程可以自動從maven倉庫
下載jar包,非常方便。
2.5 使用maven的好處
通過上邊介紹傳統專案和maven專案在專案構建及依賴管理方面的區域,maven有如下的好處:
-
一步構建
maven對專案構建的過程進行標準化,通過一個命令即可完成構建過程。
-
依賴管理
maven工程不用手動導jar包,通過在pom.xml中定義座標從maven倉庫自動下載,方便且不易出錯。
-
maven的跨平臺,可在window、linux上使用。
-
maven遵循規範開發有利於提高大型團隊的開發效率,降低專案的維護成本,大公司都會考慮使用maven來構
建專案。
3 maven安裝
3.1 下載安裝
解壓
將maven解壓到一個不含有中文和空格的目錄中。
-
bin目錄 mvn.bat (以run方式執行專案)、 mvnDebug.bat(以debug方式執行專案 )
-
boot目錄 maven執行需要類載入器
-
conf目錄 settings.xml 整個maven工具核心配置檔案
-
lib目錄 maven執行依賴jar包
3.2 環境變數配置
-
maven環境配置,增加一個環境變數M2_HOME,值是maven的安裝路徑(
C:\Program Files\apache-maven-3.5.0-bin\apache-maven-3.5.0
) -
修改path則是在path最後面新增
;%M2_HOME%\bin
。 -
-
-
將 %M2_HOME%/bin 加入環境變數 path
通過 mvn -v命令檢查 maven是否安裝成功,看到maven的版本為3.3.9及java版本為1.8即為安裝成功。
-
-
3.3 maven倉庫
3.3.1 倉庫有三種
-
本地倉庫
-
本地倉庫的預設路徑為使用者.m2\repository
-
我們可以在setting.xml中用
<localRepository>D:\repository</localRepository>
欄位修改本地倉庫的路徑
-
-
遠端倉庫
-
如果專案依賴的庫在本地倉庫中沒有找到,maven就會去遠端倉庫找,maven有預設的遠端倉庫,就是他的中央倉庫
-
-
映象倉庫
-
一般預設的遠端倉庫在國內可能連線不上,所以我們可以修改遠端倉庫的地址為國內的映象倉庫上
-
修改maven根目錄下的conf資料夾中的setting.xml檔案,內容如下:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里雲公共倉庫</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
-
(可以理解為網際網路上的倉庫)下載jar包並存在本地倉庫,本地倉庫 就是本地資料夾,當第二次需要此jar包時則不再從遠端倉庫下載,因為本地倉庫已經存在了,可以將本地倉庫理解為快取,有了本地倉庫就不用每次從遠端倉 庫下載了。
下圖描述了maven中倉庫的型別:.
本地倉庫 :用來儲存從遠端倉庫或中央倉庫下載的外掛和jar包,專案使用一些外掛或jar包,優先從本地倉庫查詢。預設本地倉庫位置在meven根目錄下conf/settings.xml中,可看出: ,{user.dir}表示windows使用者目錄。
遠端倉庫:如果本地需要外掛或者jar包,本地倉庫沒有,預設去遠端倉庫下載。遠端倉庫可以在網際網路內也 可以在區域網內。
中央倉庫 :在maven軟體中內建一個遠端倉庫地址http://repo1.maven.org/maven2,它是中央倉庫,服務於整個網際網路,它是由Maven團隊自己維護,裡面儲存了非常全的jar包,它包含了世界上大部分流行的開源專案構件。
3.3.3 配置本地倉庫
在D盤目錄下建立repository資料夾:
在MAVE_HOME/conf/settings.xml檔案中配置本地倉庫位置:
3.3.4 全域性setting與使用者setting
-
maven倉庫地址、私服等配置資訊需要在setting.xml檔案中配置,分為全域性配置和使用者配置。
-
全域性配置:在maven安裝目錄下的有 conf/setting.xml檔案,此setting.xml檔案用於maven的所有project專案,它作為maven的全域性配置。
-
使用者配置:如需要個性配置則需要在使用者配置中設定,使用者配置的setting.xml檔案預設的位置在:目錄中{user.dir} 指windows 中的使用者目錄。
-
maven會先找使用者配置,如果找到則以使用者配置檔案為準,否則使用全域性配置檔案。
4、入門
4.1 約定目錄
使用maven建立的工程我們稱它為maven工程,maven工程具有一定的目錄規範,如下:
-
src/main/java —— 存放專案的.java檔案
src/main/resources —— 存放專案資原始檔,如spring, hibernate配置檔案
src/test/java —— 存放所有單元測試.java檔案,如JUnit測試類
src/test/resources —— 測試資原始檔
-
pom.xml——maven專案核心配置檔案Project
4.2 建立專案
1.命令列建立普通java專案
mvn archetype:generate -DgroupId=net.wanho -DartifactId=javademo -DarchetypeArtifactId=maven-archetype-quickstart
2.命令列建立javaWeb專案
mvn archetype:generate -DgroupId=net.wanho -DartifactId=javawebdemo -DarchetypeArtifactId=maven-archetype-webapp
4.3 常用的maven命令
在cmd的狀態下測試
mvn -v 檢視 maven 版本
-compile 編譯
-test 測試
-package 打包
-clean 刪除 target
-install 安裝 jar 包到本地倉庫
4.3.1 compile
compile是maven工程的編譯命令,作用是將src/main/java下的檔案編譯為class檔案輸出到target目錄下。
cmd進入命令狀態,執行mvn compile,如下圖提示成功:
檢視 target目錄,class檔案已生成,編譯完成。
4.3.2 test
test是maven工程的測試命令,會執行src/test/java下的單元測試類。
cmd執行mvn test執行src/test/java下單元測試類,下圖為測試結果,執行1個測試用例,全部成功。
4.3.3 clean
clean是maven工程的清理命令,執行 clean會刪除target目錄的內容。
4.3.4 package
package是maven工程的打包命令,對於java工程執行package打成jar包,對於web工程打成war包。
4.3.5 install
install是maven工程的安裝命令,執行install將maven打成jar包或war包釋出到本地倉庫。
4.4.1 三套生命週期
maven對專案構建過程分為三套相互獨立的生命週期,請注意這裡說的是“三套”,而且“相互獨立”,這三套生命周 期分別是:
-
Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
-
Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
-
Site Lifecycle 生成專案報告,站點,釋出站點。
完整的專案構建過程包括: 清理、編譯、測試、打包、整合測試、驗證、部署
4.4.2 maven三套獨立的生命週期
clean 清理專案
1.pre-clean 執行清理前的工作
2.clean 清理上一次構建生成的所有檔案
3.post-clean 執行清理後的檔案
default 構建專案(最核心)
compile test package install
site 生成專案站點
1. pre-site 在生成專案站點前要完成的工作
2. site 生成專案的站點文件
3. post-site 在生成專案站點後要完成的工作
4. site-deploy 釋出生成的站點到伺服器上
4.4.3 命令與生命週期的階段
每個maven命令對應生命週期的某個階段,例如:mvn clean 命令對應clean生命週期的clean階段, mvn test 命令對應default生命週期的test階段。
執行命令會將該命令在的在生命週期當中之前的階段自動執行,比如:執行mvn clean 命令會自動執行pre-clean 和clean兩個階段,mvn test命令會自動執行validate、compile、test等階段。
注意:執行某個生命週期的某個階段不會影響其它的生命週期!
如果要同時執行多個生命週期的階段可在命令列輸入多個命令,中間以空格隔開,例如:
clean package 該命令執行clean生命週期的clean階段和default生命週期的package階段。
Maven包含了一個專案物件模型 (Project Object Model),一組標準集合,一個專案生命週期(Project Lifecycle), 一個依賴管理系統(Dependency Management System),和用來執行定義在生命週期階段(phase)中外掛(plugin) 目標(goal)的邏輯。
下圖是maven的概念模型圖:
專案物件模型 (Project Object Model)
一個maven工程都有一個pom.xml檔案,通過pom.xml檔案定義專案的座標、專案依賴、專案資訊、外掛目標 等。
依賴管理系統(Dependency Management System)
通過maven的依賴管理對專案所依賴的jar 包進行統一管理。
比如:專案依賴junit4.9,通過在pom.xml中定義junit4.9的依賴即使用junit4.9,如下所示是junit4.9的依賴定義:
<!‐‐ 依賴關係 ‐‐>
<dependencies>
<!‐‐ 此專案執行使用junit,所以此專案依賴junit ‐‐>
<dependency>
<!‐‐ junit的組織名稱 ‐‐>
<groupId>junit</groupId>
<!‐‐ junit的模組名稱 ‐‐>
<artifactId>junit</artifactId>
<!‐‐ junit版本 ‐‐>
<version>4.9</version>
<!‐‐ 依賴範圍:單元測試時使用junit ‐‐>
<scope>test</scope>
</dependency>
</dependencies>
一個專案生命週期(Project Lifecycle)
使用maven完成專案的構建,專案構建包括:清理、編譯、測試、部署等過程,maven將這些過程規範為一個生命週期,如下所示是生命週期的各個階段:
maven通過執行一些簡單命令即可實現上邊生命週期的各個過程,比如執行mvn compile執行編譯、執行mvn clean執行清理。
一組標準集合
maven將整個專案管理過程定義一組標準,比如:通過maven構建工程有標準的目錄結構,有標準的生命週期階段、依賴管理有標準的座標定義等。
外掛(plugin)目標(goal)
maven 管理專案生命週期過程都是基於外掛完成的。
5、在Idea中Maven的配置與使用
5.2 建立專案
5.2.1 新建一個java 專案
5.2.2 新建一個java_web專案名
5.2.2.1 建立web專案
-
你要選擇maven然後按照下面圖片的指示操作就可以了---》最後點選next按鈕
點選Finish後專案開始建立
點選右下角檢視進去
-
更新依賴
5.2.2.2 配置tomcat伺服器
5.2.2.3 使用tomcat外掛
-
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>9090</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>