第1章 Maven 介紹
什么是 Maven
什么是 Maven
Maven 的正確發(fā)音是[?mev?n]揣炕,而不是“馬瘟”以及其他什么瘟。Maven 在美國是一個口語化的詞
語常柄,代表專家琳猫、內(nèi)行的意思梅誓。
一個對 Maven 比較正式的定義是這么說的:Maven 是一個項目管理工具沽讹,它包含了一個項目對象模
型 (POM:Project Object Model),一組標(biāo)準(zhǔn)集合藻烤,一個項目生命周期(Project Lifecycle)绷雏,一個依賴管
理系統(tǒng)(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(biāo)
(goal)的邏輯怖亭。
Maven 能解決什么問題
可以用更通俗的方式來說明涎显。我們知道,項目開發(fā)不僅僅是寫寫代碼而已依许,期間會伴隨著各種必不可少的事情要做棺禾,下面列舉幾個感受一下:
- 我們需要引用各種 jar 包,尤其是比較大的工程峭跳,引用的 jar 包往往有幾十個乃至上百個膘婶, 每用
到一種 jar 包,都需要手動引入工程目錄蛀醉,而且經(jīng)常遇到各種讓人抓狂的 jar 包沖突悬襟,版本沖突。 - 我們辛辛苦苦寫好了 Java 文件拯刁,可是只懂 0 和 1 的白癡電腦卻完全讀不懂脊岳,需要將它編譯成二
進(jìn)制字節(jié)碼。好歹現(xiàn)在這項工作可以由各種集成開發(fā)工具幫我們完成垛玻,Eclipse割捅、IDEA 等都可以將代
碼即時編譯。當(dāng)然帚桩,如果你嫌生命漫長亿驾,何不鋪張,也可以用記事本來敲代碼账嚎,然后用 javac 命令一
個個地去編譯莫瞬,逗電腦玩儡蔓。 - 世界上沒有不存在 bug 的代碼,計算機(jī)喜歡 bug 就和人們總是喜歡美女帥哥一樣疼邀。為了追求美為
了減少 bug喂江,因此寫完了代碼,我們還要寫一些單元測試旁振,然后一個個的運行來檢驗代碼質(zhì)量获询。 - 再優(yōu)雅的代碼也是要出來賣的。我們后面還需要把代碼與各種配置文件拐袜、資源整合到一起筐付,定型
打包,如果是 web 項目阻肿,還需要將之發(fā)布到服務(wù)器,供人蹂躪沮尿。
試想丛塌,如果現(xiàn)在有一種工具,可以把你從上面的繁瑣工作中解放出來畜疾,能幫你構(gòu)建工程赴邻,管理 jar
包,編譯代碼啡捶,還能幫你自動運行單元測試姥敛,打包,生成報表瞎暑,甚至能幫你部署項目彤敛,生成 Web 站點,你會心動嗎了赌?Maven 就可以解決上面所提到的這些問題墨榄。
Maven 的依賴管理
Maven 的一個核心特性就是依賴管理。當(dāng)我們涉及到多模塊的項目(包含成百個模塊或者子項目)勿她,管理依賴就變成
一項困難的任務(wù)袄秩。Maven 展示出了它對處理這種情形的高度控制。
傳統(tǒng)的 WEB 項目中逢并,我們必須將工程所依賴的 jar 包復(fù)制到工程中之剧,導(dǎo)致了工程的變得很大。
分析如下:
Maven 的使用
Maven 的安裝
Maven 軟件的下載
為了使用 Maven 管理工具砍聊,我們首先要到官網(wǎng)去下載它的安裝軟件背稼。通過百度搜索“Maven“如下:
點擊 Download 鏈接,就可以直接進(jìn)入到 Maven 軟件的下載頁面:
Maven 軟件的安裝
Maven 下載后辩恼,將 Maven 解壓到一個沒有中文沒有空格的路徑下雇庙,比如 D:\software\maven 下面谓形。
解壓后目錄結(jié)構(gòu)如下:
- bin:存放了 maven 的命令,比如我們前面用到的 mvn tomcat:run
- boot:存放了一些 maven 本身的引導(dǎo)程序疆前,如類加載器等
- conf:存放了 maven 的一些配置文件寒跳,如 setting.xml 文件
- lib:存放了 maven 本身運行所需的一些 jar 包
至此我們的 maven 軟件就可以使用了,前提是你的電腦上之前已經(jīng)安裝并配置好了 JDK竹椒。
Maven 及 JDK 配置
電腦上需安裝 java 環(huán)境童太,安裝 JDK1.7 + 版本 (將JAVA_HOME/bin 配置環(huán)境變量 path ),我們使用的是 JDK8 相關(guān)版本配置 MAVEN_HOME 胸完,變量值就是你的 maven 安裝 的路徑(bin 目錄之前一級目錄)上面配置了我們的 Maven 軟件书释,注意這個目錄就是之前你解壓 maven 的壓縮文件包在的的目錄,最好不要有中文和空格赊窥。
再次檢查 JDK 的安裝目錄爆惧。
Maven 軟件版本測試
通過 mvn -v命令檢查 maven 是否安裝成功,看到 maven 的版本為 3.5.2 及 java 版本為 1.8 即為安裝成功锨能。找開 cmd 命令扯再,輸入 mvn –v命令,如下圖:
我們發(fā)現(xiàn) maven 的版本址遇,及 jdk 的版本符合要求熄阻,這樣我們的 maven 軟件安裝就成功了。
Maven 倉庫
Maven 倉庫的分類
maven 的工作需要從倉庫下載一些 jar 包倔约,如下圖所示秃殉,本地的項目 A、項目 B 等都會通過 maven
軟件從遠(yuǎn)程倉庫(可以理解為互聯(lián)網(wǎng)上的倉庫)下載 jar 包并存在本地倉庫浸剩,本地倉庫 就是本地文
件夾钾军,當(dāng)?shù)诙涡枰?jar 包時則不再從遠(yuǎn)程倉庫下載,因為本地倉庫已經(jīng)存在了乒省,可以將本地倉庫
理解為緩存巧颈,有了本地倉庫就不用每次從遠(yuǎn)程倉庫下載了。
下圖描述了 maven 中倉庫的類型:
本地倉庫 :用來存儲從遠(yuǎn)程倉庫或中央倉庫下載的插件和 jar 包袖扛,項目使用一些插件或 jar 包砸泛,優(yōu)先從本地倉庫查找
-
默認(rèn)本地倉庫位置在 {user.dir}表示 windows 用戶目錄蛆封。
遠(yuǎn)程倉庫:如果本地需要插件或者 jar 包唇礁,本地倉庫沒有,默認(rèn)去遠(yuǎn)程倉庫下載惨篱。
遠(yuǎn)程倉庫可以在互聯(lián)網(wǎng)內(nèi)也可以在局域網(wǎng)內(nèi)盏筐。中央倉庫 :在 maven 軟件中內(nèi)置一個遠(yuǎn)程倉庫地址 http://repo1.maven.org/maven2 ,它是中央倉庫砸讳,服務(wù)于整個互聯(lián)網(wǎng)琢融,它是由 Maven 團(tuán)隊自己維護(hù)界牡,里面存儲了非常全的 jar 包,它包含了世界上大部分流行的開源項目構(gòu)件漾抬。
Maven 本地倉庫的配置
本課程是在無網(wǎng)的狀態(tài)下學(xué)習(xí)宿亡,需要配置資料提供的本地倉庫,將 “repository.rar”解壓至自己的電腦上纳令,我們解壓在 D:\repository 目錄下(可以放在沒有中文及空格的目錄下)挽荠。
在 MAVE_HOME/conf/settings.xml 文件中配置本地倉庫位置(maven 的安裝目錄下):
打開 settings.xml文件,配置如下:
全局 setting 與用戶 setting
maven 倉庫地址平绩、私服等配置信息需要在 setting.xml 文件中配置圈匆,分為全局配置和用戶配置。
在 maven 安裝目錄下的有 conf/setting.xml 文件捏雌,此 setting.xml 文件用于 maven 的所有 project項目跃赚,它作為 maven 的全局配置。
如需要個性配置則需要在用戶配置中設(shè)置性湿,用戶配置的 setting.xml 文件默認(rèn)的位置在:{user.dir} 指 windows 中的用戶目錄来累。
maven 會先找用戶配置,如果找到則以用戶配置文件為準(zhǔn)窘奏,否則使用全局配置文件。
Maven 工程的認(rèn)識
Maven 工程的目錄結(jié)構(gòu)
作為一個 maven 工程葫录,它的 src 目錄和 pom.xml 是必備的着裹。
進(jìn)入 src 目錄后,我們發(fā)現(xiàn)它里面的目錄結(jié)構(gòu)如下:
- src/main/java —— 存放項目的.java 文件
- src/main/resources —— 存放項目資源文件米同,如 spring, hibernate 配置文件
- src/test/java —— 存放所有單元測試.java 文件骇扇,如 JUnit 測試類
- src/test/resources —— 測試資源文件
- target —— 項目輸出位置,編譯后的 class 文件會輸出到此目錄
- pom.xml——maven 項目核心配置文件
- 注意:如果是普通的 java 項目面粮,那么就沒有 webapp 目錄少孝。
Maven 工程的運行
進(jìn)入 maven 工程目錄(當(dāng)前目錄有 pom.xml 文件),運行 tomcat:run 命令熬苍。
問題處理
如果本地倉庫配置錯誤會報下邊的錯誤
分析:
maven 工程運行先從本地倉庫找 jar 包稍走,本地倉庫沒有再從中央倉庫找,上邊提示 downloading…
表示 從中央倉庫下載 jar柴底,由于本地沒有聯(lián)網(wǎng)婿脸,報錯。
解決:
在 maven 安裝目錄的 conf/setting.xml 文件中配置本地倉庫柄驻,參考:“maven 倉庫/配置本地倉庫章節(jié)”狐树。
Maven 常用命令
我們可以在 cmd 中通過一系列的 maven 命令來對我們的 maven-helloworld 工程進(jìn)行編譯、測試鸿脓、運
行抑钟、打包涯曲、安裝、部署在塔。
compile
compile 是 maven 工程的編譯命令幻件,作用是將 src/main/java 下的文件編譯為 class 文件輸出到 target目錄下。
cmd 進(jìn)入命令狀態(tài)心俗,執(zhí)行 mvn compile傲武,如下圖提示成功:
查看 target 目錄,class 文件已生成城榛,編譯完成揪利。
test
test 是 maven 工程的測試命令 mvn test,會執(zhí)行 src/test/java 下的單元測試類狠持。cmd 執(zhí)行 mvn test 執(zhí)行 src/test/java 下單元測試類疟位,下圖為測試結(jié)果,運行 1 個測試用例喘垂,全部成功甜刻。
clean
clean 是 maven 工程的清理命令,執(zhí)行 clean 會刪除 target 目錄及內(nèi)容正勒。
package
package 是 maven 工程的打包命令得院,對于 java 工程執(zhí)行 package 打成 jar 包,對于 web 工程打成 war
包章贞。
install
install 是 maven 工程的安裝命令祥绞,執(zhí)行 install 將 maven 打成 jar 包或 war 包發(fā)布到本地倉庫。從運行結(jié)果中鸭限,可以看出,當(dāng)后面的命令執(zhí)行時蜕径,前面的操作過程也都會自動執(zhí)行。
Maven 指令的生命周期
maven 對項目構(gòu)建過程分為三套相互獨立的生命周期败京,請注意這里說的是“三套”兜喻,而且“相互獨立”。
這三套生命周期分別是:
- Clean Lifecycle 在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作赡麦。
- Default Lifecycle 構(gòu)建的核心部分朴皆,編譯,測試泛粹,打包车荔,部署等等。
- Site Lifecycle 生成項目報告戚扳,站點忧便,發(fā)布站點。
maven 的概念模型
Maven 包含了一個項目對象模型 (Project Object Model),一組標(biāo)準(zhǔn)集合珠增,一個項目生命周期(Project Lifecycle)超歌,一個依賴管理系統(tǒng)(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯蒂教。
- 項目對象模型 (Project Object Model)
一個 maven 工程都有一個 pom.xml 文件巍举,通過 pom.xml 文件定義項目的坐標(biāo)、項目依賴凝垛、項目信息懊悯、
插件目標(biāo)等。 - 依賴管理系統(tǒng)(Dependency Management System)
通過 maven 的依賴管理對項目所依賴的 jar 包進(jìn)行統(tǒng)一管理梦皮。
比如:項目依賴 junit4.9炭分,通過在 pom.xml 中定義 junit4.9 的依賴即使用 junit4.9,如下所示是 junit4.9
的依賴定義:
<!-- 依賴關(guān)系 -->
<dependencies>
<!-- 此項目運行使用 junit剑肯,所以此項目依賴 junit -->
<dependency>
<!-- junit 的項目名稱 -->
<groupId>junit</groupId>
<!-- junit 的模塊名稱 -->
<artifactId>junit</artifactId>
<!-- junit 版本 -->
<version>4.9</version>
<!-- 依賴范圍:單元測試時使用 junit -->
<scope>test</scope>
</dependency>
-
一個項目生命周期(Project Lifecycle)
使用 maven 完成項目的構(gòu)建捧毛,項目構(gòu)建包括:清理、編譯让网、測試呀忧、部署等過程,maven 將這些過程規(guī)范為一個生命周期溃睹,如下所示是生命周期的各各階段:
maven 通過執(zhí)行一些簡單命令即可實現(xiàn)上邊生命周期的各各過程而账,比如執(zhí)行 mvn compile 執(zhí)行編譯、執(zhí)行 mvn clean 執(zhí)行清理因篇。
- 一組標(biāo)準(zhǔn)集合
maven 將整個項目管理過程定義一組標(biāo)準(zhǔn)福扬,比如:通過 maven 構(gòu)建工程有標(biāo)準(zhǔn)的目錄結(jié)構(gòu),有標(biāo)準(zhǔn)的生命周期階段惜犀、依賴管理有標(biāo)準(zhǔn)的坐標(biāo)定義等绅喉。
- 插件(plugin)目標(biāo)(goal)
maven 管理項目生命周期過程都是基于插件完成的眶熬。
idea 開發(fā) maven 項目
idea 的 maven 配置
打開FileSettings 配置 maven
依據(jù)圖片指示异逐,選擇本地 maven 安裝目錄积瞒,指定 maven 安裝目錄下 conf 文件夾中 settings 配置文件肚豺。
idea 中創(chuàng)建一個 maven 的 web 工程
打開 idea残黑,選擇創(chuàng)建一個新工程
選擇 idea 提供好的 maven 的web 工程模板
點擊 Next 填寫項目信息
點擊 Next俗孝,此處不做改動匙奴。
點擊 Next 選擇項目所在目錄
點擊 Finish 后開始創(chuàng)建工程俗冻,耐心等待礁叔,直到出現(xiàn)如下界面。
手動添加 src/main/java 目錄迄薄,如下圖右鍵 main 文件夾》New》Directory
創(chuàng)建一個新的文件夾命名為 java
點擊 OK 后琅关,在新的文件夾 java 上右鍵>Make Directory as>Sources Root
創(chuàng)建一個 Servlet
src/java/main 創(chuàng)建了一個 Servlet,但報錯
要解決問題讥蔽,就是要將 servlet-api-xxx.jar 包放進(jìn)來涣易,作為 maven 工程應(yīng)當(dāng)添加 servlet 的坐標(biāo)画机,從而導(dǎo)入它的 jar
在 pom.xml 文件添加坐標(biāo)
直接打開 hello_maven 工程的 pom.xml 文件,再添加坐標(biāo)
添加 jar 包的坐標(biāo)時新症,還可以指定這個 jar 包將來的作用范圍步氏。
每個 maven 工程都需要定義本工程的坐標(biāo),坐標(biāo)是 maven 對 jar 包的身份定義徒爹,比如:入門程序的
坐標(biāo)定義如下:
<!--項目名稱荚醒,定義為組織名+項目名,類似包名-->
<groupId>com.itheima</groupId>
<!-- 模塊名稱 -->
<artifactId>hello_maven</artifactId>
<!-- 當(dāng)前項目版本號隆嗅,snapshot 為快照版本即非正式版本界阁,release 為正式發(fā)布版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包類型
jar:執(zhí)行 package 會打成 jar 包
war:執(zhí)行 package 會打成 war 包
pom :用于 maven 工程的繼承,通常父工程設(shè)置為 pom
坐標(biāo)的來源方式
添加依賴需要指定依賴 jar 包的坐標(biāo)榛瓮,但是很多情況我們是不知道 jar 包的的坐標(biāo)铺董,可以通過如下方
式查詢:
從互聯(lián)網(wǎng)搜索
依賴范圍
A 依賴 B,需要在 A 的 pom.xml 文件中添加 B 的坐標(biāo)禀晓,添加坐標(biāo)時需要指定依賴范圍精续,依賴范圍包
括:
compile:編譯范圍,指 A 在編譯時依賴 B粹懒,此范圍為默認(rèn)依賴范圍重付。編譯范圍的依賴會用在
編譯、測試凫乖、運行确垫,由于運行時需要所以編譯范圍的依賴會被打包。provided:provided 依賴只有在當(dāng) JDK 或者一個容器已提供該依賴之后才使用帽芽, provided 依
賴在編譯和測試時需要删掀,在運行時不需要,比如:servlet api 被 tomcat 容器提供导街。runtime:runtime 依賴在運行和測試系統(tǒng)的時候需要披泪,但在編譯的時候不需要。比如:jdbc
的驅(qū)動包搬瑰。由于運行時需要所以 runtime 范圍的依賴會被打包款票。test:test 范圍依賴 在編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用泽论,
比如:junit艾少。由于運行時不需要所以 test范圍依賴不會被打包。-
system:system 范圍依賴與 provided 類似翼悴,但是你必須顯式的提供一個對于本地系統(tǒng)中 JAR
文件的路徑缚够,需要指定 systemPath 磁盤路徑,system依賴不推薦使用。
在 maven-web 工程中測試各各 scop潮瓶。
測試總結(jié):
- 默認(rèn)引入 的 jar 包 ------- compile 【默認(rèn)范圍 可以不寫】(編譯陶冷、測試、運行 都有效 )
- servlet-api 毯辅、jsp-api ------- provided (編譯埂伦、測試 有效, 運行時無效 防止和 tomcat 下 jar 沖突)
- jdbc 驅(qū)動 jar 包 ---- runtime (測試思恐、運行 有效 )
- junit ----- test (測試有效)
依賴范圍由強(qiáng)到弱的順序是:compile>provided>runtime>test
項目中添加的坐標(biāo)
設(shè)置 jdk 編譯版本
本教程使用 jdk1.8沾谜,需要設(shè)置編譯版本為 1.8,這里需要使用 maven 的插件來設(shè)置:
在 pom.xml 中加入:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
編寫 servlet
在 src/main/java 中創(chuàng)建 ServletTest
編寫 jsp
在 web.xml 中配置 servlet 訪問路徑
添加 tomcat7 插件
在 pom 文件中添加如下內(nèi)容
- 此時點擊 idea 最右側(cè) Maven Projects胀莹,
- 就可以看到我們新添加的 tomcat7 插件
- 雙擊 tomcat7插件下 tomcat7:run 命令直接運行項目
也可以直接點擊如圖按鈕基跑,手動輸入 tomc7:run 命令運行項目
maven 工程運行調(diào)試
端口占用處理
重新執(zhí)行 tomcat:run 命令重啟工程,重啟之前需手動停止 tomcat描焰,否則報下邊的錯誤
斷點調(diào)試
點擊如圖所示選項
在彈出框中點擊如圖加號按鈕找到 maven 選項
在彈出窗口中填寫如下信息
完成后先 Apply 再 OK 結(jié)束配置后媳否,可以在主界面找到我們剛才配置的操作名稱。
如上圖紅框選中的兩個按鈕荆秦,左側(cè)是正常啟動篱竭,右側(cè)是 debug 啟動。
總結(jié)
maven 倉庫
- maven 倉庫的類型有哪些步绸?
- maven 工程查找倉庫的流程是什么掺逼?
- 本地倉庫如何配置?
常用的 maven 命令
- 常用 的 maven 命令包括:
- compile:編譯
- clean:清理
- test:測試
- package:打包
- install:安裝
坐標(biāo)定義
在 pom.xml 中定義坐標(biāo)瓤介,內(nèi)容包括:groupId吕喘、artifactId、version刑桑,詳細(xì)內(nèi)容如下:
<!--項目名稱氯质,定義為組織名+項目名,類似包名-->
<groupId>cn.itcast.maven</groupId>
<!-- 模塊名稱 -->
<artifactId>maven-first</artifactId>
<!-- 當(dāng)前項目版本號祠斧,snapshot 為快照版本即非正式版本闻察,release 為正式發(fā)布版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包類型
jar:執(zhí)行 package 會打成 jar 包
war:執(zhí)行 package 會打成 war 包
pom :用于 maven 工程的繼承,通常父工程設(shè)置為 pom
5.4 pom 基本配置
pom.xml 是 Maven 項目的核心配置文件梁肿,位于每個工程的根目錄,基本配置如下:
<project > :文件的根節(jié)點 .
<modelversion > : pom.xml 使用的對象模型版本
<groupId > :項目名稱觅彰,一般寫項目的域名
<artifactId > :模塊名稱吩蔑,子項目名或模塊名稱
<version > :產(chǎn)品的版本號 .
<packaging > :打包類型,一般有 jar填抬、war烛芬、pom 等
<name > :項目的顯示名,常用于 Maven 生成的文檔。
<description > :項目描述赘娄,常用于 Maven 生成的文檔
<dependencies> :項目依賴構(gòu)件配置仆潮,配置項目依賴構(gòu)件的坐標(biāo)
<build> :項目構(gòu)建配置,配置編譯遣臼、運行插件等性置。