Maven基礎(chǔ)
第1章Maven介紹
1.1 什么是Maven
1.1.1 什么是Maven
Maven的正確發(fā)音是[?mev?n]感混,而不是“馬瘟”以及其他什么瘟间景。Maven在美國(guó)是一個(gè)口語(yǔ)化的詞語(yǔ),代表專家、內(nèi)行的意思。
一個(gè)對(duì)Maven比較正式的定義是這么說(shuō)的:Maven是一個(gè)項(xiàng)目管理工具洋措,它包含了一個(gè)項(xiàng)目對(duì)象模型 (POM:Project Object Model),一組標(biāo)準(zhǔn)集合杰刽,一個(gè)項(xiàng)目生命周期(Project Lifecycle)菠发,一個(gè)依賴管理系統(tǒng)(Dependency Management System),和用來(lái)運(yùn)行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯贺嫂。
1.1.2 Maven能解決什么問(wèn)題
? 可以用更通俗的方式來(lái)說(shuō)明滓鸠。我們知道,項(xiàng)目開(kāi)發(fā)不僅僅是寫(xiě)寫(xiě)代碼而已第喳,期間會(huì)伴隨著各種必不可少的事情要做哥力,下面列舉幾個(gè)感受一下:
- 我們需要引用各種jar包,尤其是比較大的工程,引用的jar包往往有幾十個(gè)乃至上百個(gè)吩跋, 每用到一種jar包寞射,都需要手動(dòng)引入工程目錄,而且經(jīng)常遇到各種讓人抓狂的jar包沖突锌钮,版本沖突桥温。
- 我們辛辛苦苦寫(xiě)好了Java文件,可是只懂0和1的白癡電腦卻完全讀不懂梁丘,需要將它編譯成二進(jìn)制字節(jié)碼侵浸。好歹現(xiàn)在這項(xiàng)工作可以由各種集成開(kāi)發(fā)工具幫我們完成,Eclipse氛谜、IDEA等都可以將代碼即時(shí)編譯掏觉。當(dāng)然,如果你嫌生命漫長(zhǎng)值漫,何不鋪張澳腹,也可以用記事本來(lái)敲代碼,然后用javac命令一個(gè)個(gè)地去編譯杨何,逗電腦玩酱塔。
- 世界上沒(méi)有不存在bug的代碼,計(jì)算機(jī)喜歡bug就和人們總是喜歡美女帥哥一樣危虱。為了追求美為了減少bug羊娃,因此寫(xiě)完了代碼,我們還要寫(xiě)一些單元測(cè)試埃跷,然后一個(gè)個(gè)的運(yùn)行來(lái)檢驗(yàn)代碼質(zhì)量蕊玷。
- 再優(yōu)雅的代碼也是要出來(lái)賣的。我們后面還需要把代碼與各種配置文件弥雹、資源整合到一起集畅,定型打包,如果是web項(xiàng)目缅糟,還需要將之發(fā)布到服務(wù)器,供人蹂躪祷愉。
試想窗宦,如果現(xiàn)在有一種工具,可以把你從上面的繁瑣工作中解放出來(lái)二鳄,能幫你構(gòu)建工程赴涵,管理jar包,編譯代碼订讼,還能幫你自動(dòng)運(yùn)行單元測(cè)試髓窜,打包,生成報(bào)表,甚至能幫你部署項(xiàng)目寄纵,生成Web站點(diǎn)鳖敷,你會(huì)心動(dòng)嗎?Maven就可以解決上面所提到的這些問(wèn)題程拭。
1.1.3 Maven的優(yōu)勢(shì)舉例
前面我們通過(guò)Web階段項(xiàng)目定踱,要能夠?qū)㈨?xiàng)目運(yùn)行起來(lái),就必須將該項(xiàng)目所依賴的一些jar包添加到工程中恃鞋,否則項(xiàng)目就不能運(yùn)行崖媚。試想如果具有相同架構(gòu)的項(xiàng)目有十個(gè),那么我們就需要將這一份jar包復(fù)制到十個(gè)不同的工程中恤浪。我們一起來(lái)看一個(gè)CRM項(xiàng)目的工程大小畅哑。
使用傳統(tǒng)Web項(xiàng)目構(gòu)建的CRM項(xiàng)目如下:
原因主要是因?yàn)樯厦娴腤EB程序要運(yùn)行,我們必須將項(xiàng)目運(yùn)行所需的Jar包復(fù)制到工程目錄中水由,從而導(dǎo)致了工程很大荠呐。
同樣的項(xiàng)目,如果我們使用Maven工程來(lái)構(gòu)建绷杜,會(huì)發(fā)現(xiàn)總體上工程的大小會(huì)少很多直秆。如下圖:
小結(jié):可以初步推斷它里面一定沒(méi)有jar 包,繼續(xù)思考鞭盟,沒(méi)有jar包的項(xiàng)目怎么可能運(yùn)行呢圾结?
1.2 Maven的兩個(gè)精典作用
1.2.1 Maven的依賴管理
Maven的一個(gè)核心特性就是依賴管理。當(dāng)我們涉及到多模塊的項(xiàng)目(包含成百個(gè)模塊或者子項(xiàng)目)齿诉,管理依賴就變成一項(xiàng)困難的任務(wù)筝野。Maven展示出了它對(duì)處理這種情形的高度控制。
傳統(tǒng)的WEB項(xiàng)目中粤剧,我們必須將工程所依賴的jar包復(fù)制到工程中歇竟,導(dǎo)致了工程的變得很大。那么maven工程是如何使得工程變得很少呢抵恋?
分析如下:
通過(guò)分析發(fā)現(xiàn):maven工程中不直接將jar包導(dǎo)入到工程中焕议,而是通過(guò)在pom.xml文件中添加所需jar包的坐標(biāo),這樣就很好的避免了jar直接引入進(jìn)來(lái)弧关,在需要用到j(luò)ar包的時(shí)候盅安,只要查找pom.xml文件,再通過(guò)pom.xml文件中的坐標(biāo)世囊,到一個(gè)專門用于”存放jar包的倉(cāng)庫(kù)”(maven倉(cāng)庫(kù))中根據(jù)坐標(biāo)從而找到這些jar包别瞭,再把這些jar包拿去運(yùn)行。
那么問(wèn)題來(lái)了
第一:”存放jar包的倉(cāng)庫(kù)”長(zhǎng)什么樣株憾?
第二:通過(guò)讀取pom.xml 文件中的坐標(biāo)蝙寨,再到倉(cāng)庫(kù)中找到j(luò)ar包晒衩,會(huì)不會(huì)很慢?從而導(dǎo)致這種方式不可行墙歪!
第一個(gè)問(wèn)題:存放jar包的倉(cāng)庫(kù)長(zhǎng)什么樣听系,這一點(diǎn)我們后期會(huì)分析倉(cāng)庫(kù)的分類,也會(huì)帶大家去看我們的本地的倉(cāng)庫(kù)長(zhǎng)什么樣箱亿。
第二個(gè)問(wèn)題:通過(guò)pom.xml文件配置要引入的jar包的坐標(biāo)跛锌,再讀取坐標(biāo)并到倉(cāng)庫(kù)中加載jar包,這樣我們就可以直接使用jar包了届惋,為了解決這個(gè)過(guò)程中速度慢的問(wèn)題髓帽,maven中也有索引的概念,通過(guò)建立索引脑豹,可以大大提高加載jar包的速度郑藏,使得我們認(rèn)為jar包基本跟放在本地的工程文件中再讀取出來(lái)的速度是一樣的。這個(gè)過(guò)程就好比我們查閱字典時(shí)瘩欺,為了能夠加快查找到內(nèi)容必盖,書(shū)前面的目錄就好比是索引,有了這個(gè)目錄我們就可以方便找到內(nèi)容了俱饿,一樣的在maven倉(cāng)庫(kù)中有了索引我們就可以認(rèn)為可以快速找到j(luò)ar包歌粥。
1.2.2 項(xiàng)目的一鍵構(gòu)建
我們的項(xiàng)目拍埠,往往都要經(jīng)歷編譯失驶、測(cè)試、運(yùn)行枣购、打包嬉探、安裝 ,部署等一系列過(guò)程棉圈。
什么是構(gòu)建涩堤?
指的是項(xiàng)目從編譯、測(cè)試分瘾、運(yùn)行胎围、打包、安裝 德召,部署整個(gè)過(guò)程都交給maven進(jìn)行管理白魂,這個(gè)過(guò)程稱為構(gòu)建。
一鍵構(gòu)建指的是整個(gè)構(gòu)建過(guò)程氏捞,使用maven一個(gè)命令可以輕松完成整個(gè)工作。
Maven規(guī)范化構(gòu)建流程如下:
我們一起來(lái)看Hello-Maven工程的一鍵運(yùn)行的過(guò)程冒版。通過(guò)tomcat:run的這個(gè)命令液茎,我們發(fā)現(xiàn)現(xiàn)在的工程編譯,測(cè)試,運(yùn)行都變得非常簡(jiǎn)單捆等。
第2章Maven的使用
2.1 Maven的安裝
2.1.1 Maven軟件的下載
為了使用Maven管理工具滞造,我們首先要到官網(wǎng)去下載它的安裝軟件。通過(guò)百度搜索“Maven“如下:
點(diǎn)擊Download鏈接栋烤,就可以直接進(jìn)入到Maven軟件的下載頁(yè)面:
目前最新版是apache-maven-3.5.3版本谒养,我們當(dāng)時(shí)使用的是apache-maven-3.5.2版本,大家也可以下載最新版本明郭。
Apache-maven-3.5.2下載地址:http://archive.apache.org/dist/maven/maven-3/
下載后的版本如下:
2.1.2 Maven軟件的安裝
Maven下載后买窟,將Maven解壓到一個(gè)沒(méi)有中文沒(méi)有空格的路徑下,比如D:\software\maven下面薯定。
解壓后目錄結(jié)構(gòu)如下:
bin:存放了maven的命令始绍,比如我們前面用到的mvn tomcat:run
boot:存放了一些maven本身的引導(dǎo)程序,如類加載器等
conf:存放了maven的一些配置文件话侄,如setting.xml文件
lib:存放了maven本身運(yùn)行所需的一些jar包
至此我們的maven軟件就可以使用了亏推,前提是你的電腦上之前已經(jīng)安裝并配置好了JDK。
2.1.3 JDK的準(zhǔn)備及統(tǒng)一
本次課程我們所使用工具軟件的統(tǒng)一年堆,JDK使用JDK8版本
![jdk版本(https://upload-images.jianshu.io/upload_images/598604-01e86e8be1140e9e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.1.4 Maven及JDK配置
電腦上需安裝java環(huán)境吞杭,安裝JDK1.7 + 版本 (將JAVA_HOME/bin 配置環(huán)境變量path ),我們使用的是JDK8相關(guān)版本
配置 MAVEN_HOME 变丧,變量值就是你的maven安裝 的路徑(bin目錄之前一級(jí)目錄)
上面配置了我們的Maven軟件芽狗,注意這個(gè)目錄就是之前你解壓maven的壓縮文件包在的的目錄,最好不要有中文和空格锄贷。
再次檢查JDK的安裝目錄译蒂,如下圖:
2.1.5 Maven軟件版本測(cè)試
通過(guò) mvn -v命令檢查 maven是否安裝成功,看到maven的版本為3.5.2及java版本為1.8即為安裝成功谊却。
找開(kāi)cmd命令柔昼,輸入mvn –v命令,如下圖:
我們發(fā)現(xiàn)maven的版本炎辨,及jdk的版本符合要求捕透,這樣我們的maven軟件安裝就成功了。
2.2 Maven倉(cāng)庫(kù)
2.2.1 Maven倉(cāng)庫(kù)的分類
maven的工作需要從倉(cāng)庫(kù)下載一些jar包碴萧,如下圖所示乙嘀,本地的項(xiàng)目A、項(xiàng)目B等都會(huì)通過(guò)maven軟件從遠(yuǎn)程倉(cāng)庫(kù)(可以理解為互聯(lián)網(wǎng)上的倉(cāng)庫(kù))下載jar包并存在本地倉(cāng)庫(kù)破喻,本地倉(cāng)庫(kù) 就是本地文件夾虎谢,當(dāng)?shù)诙涡枰薺ar包時(shí)則不再?gòu)倪h(yuǎn)程倉(cāng)庫(kù)下載,因?yàn)楸镜貍}(cāng)庫(kù)已經(jīng)存在了曹质,可以將本地倉(cāng)庫(kù)理解為緩存婴噩,有了本地倉(cāng)庫(kù)就不用每次從遠(yuǎn)程倉(cāng)庫(kù)下載了擎场。
下圖描述了maven中倉(cāng)庫(kù)的類型:
- 本地倉(cāng)庫(kù) :用來(lái)存儲(chǔ)從遠(yuǎn)程倉(cāng)庫(kù)或中央倉(cāng)庫(kù)下載的插件和jar包,項(xiàng)目使用一些插件或jar包几莽,優(yōu)先從本地倉(cāng)庫(kù)查找 ,默認(rèn)本地倉(cāng)庫(kù)位置在
{user.dir}表示windows用戶目錄。
默認(rèn)庫(kù)存位置 - 遠(yuǎn)程倉(cāng)庫(kù):如果本地需要插件或者jar包章蚣,本地倉(cāng)庫(kù)沒(méi)有站欺,默認(rèn)去遠(yuǎn)程倉(cāng)庫(kù)下載。
遠(yuǎn)程倉(cāng)庫(kù)可以在互聯(lián)網(wǎng)內(nèi)也可以在局域網(wǎng)內(nèi)纤垂。 - 中央倉(cāng)庫(kù) :在maven軟件中內(nèi)置一個(gè)遠(yuǎn)程倉(cāng)庫(kù)地址http://repo1.maven.org/maven2 矾策,它是中央倉(cāng)庫(kù),服務(wù)于整個(gè)互聯(lián)網(wǎng)洒忧,它是由Maven團(tuán)隊(duì)自己維護(hù)蝴韭,里面存儲(chǔ)了非常全的jar包,它包含了世界上大部分流行的開(kāi)源項(xiàng)目構(gòu)件熙侍。
2.2.2 Maven本地倉(cāng)庫(kù)的配置
我本地倉(cāng)庫(kù)的目錄是:D:\repository(可以放在沒(méi)有中文及空格的目錄下)榄鉴。
在MAVE_HOME/conf/settings.xml文件中配置本地倉(cāng)庫(kù)位置(maven的安裝目錄下):
打開(kāi)settings.xml文件,配置如下:
2.2.3 全局setting與用戶setting
? maven倉(cāng)庫(kù)地址蛉抓、私服等配置信息需要在setting.xml文件中配置庆尘,分為全局配置和用戶配置。
? 在maven安裝目錄下的有 conf/setting.xml文件巷送,此setting.xml文件用于maven的所有project項(xiàng)目驶忌,它作為maven的全局配置。
? 如需要個(gè)性配置則需要在用戶配置中設(shè)置笑跛,用戶配置的setting.xml文件默認(rèn)的位置在:{user.dir} 指windows 中的用戶目錄付魔。
? maven會(huì)先找用戶配置,如果找到則以用戶配置文件為準(zhǔn)飞蹂,否則使用全局配置文件几苍。
2.3 Maven工程的認(rèn)識(shí)
2.3.1 Maven工程的目錄結(jié)構(gòu)
作為一個(gè)maven工程,它的src目錄和pom.xml是必備的陈哑。
進(jìn)入src目錄后妻坝,我們發(fā)現(xiàn)它里面的目錄結(jié)構(gòu)如下:
src/main/java —— 存放項(xiàng)目的.java文件
src/main/resources —— 存放項(xiàng)目資源文件,如spring, hibernate配置文件
src/test/java —— 存放所有單元測(cè)試.java文件惊窖,如JUnit測(cè)試類
src/test/resources —— 測(cè)試資源文件
target —— 項(xiàng)目輸出位置刽宪,編譯后的class文件會(huì)輸出到此目錄
pom.xml——maven項(xiàng)目核心配置文件
注意:如果是普通的java項(xiàng)目,那么就沒(méi)有webapp目錄界酒。
2.3.2 Maven工程的運(yùn)行
進(jìn)入maven工程目錄(當(dāng)前目錄有pom.xml文件)圣拄,運(yùn)行tomcat:run命令。
根據(jù)上邊的提示信息毁欣,通過(guò)瀏覽器訪問(wèn):http://localhost:8080/maven-helloworld/
2.3.3 問(wèn)題處理
如果本地倉(cāng)庫(kù)配置錯(cuò)誤會(huì)報(bào)下邊的錯(cuò)誤
分析:
maven工程運(yùn)行先從本地倉(cāng)庫(kù)找jar包庇谆,本地倉(cāng)庫(kù)沒(méi)有再?gòu)闹醒雮}(cāng)庫(kù)找赁遗,上邊提示downloading…
表示 從中央倉(cāng)庫(kù)下載jar,由于本地沒(méi)有聯(lián)網(wǎng)族铆,報(bào)錯(cuò)。
解決:
在maven安裝目錄的conf/setting.xml文件中配置本地倉(cāng)庫(kù)哭尝,參考:“maven倉(cāng)庫(kù)/配置本地倉(cāng)庫(kù)章節(jié)”哥攘。
第3章 Maven常用命令
我們可以在cmd中通過(guò)一系列的maven命令來(lái)對(duì)我們的maven-helloworld工程進(jìn)行編譯、測(cè)試材鹦、運(yùn)行逝淹、打包、安裝桶唐、部署栅葡。
3.1.1 compile
compile是maven工程的編譯命令,作用是將src/main/java下的文件編譯為class文件輸出到target目錄下尤泽。
cmd進(jìn)入命令狀態(tài)欣簇,執(zhí)行mvn compile,如下圖提示成功:
查看 target目錄坯约,class文件已生成熊咽,編譯完成。
3.1.2 test
test是maven工程的測(cè)試命令 mvn test闹丐,會(huì)執(zhí)行src/test/java下的單元測(cè)試類横殴。
cmd執(zhí)行mvn test執(zhí)行src/test/java下單元測(cè)試類,下圖為測(cè)試結(jié)果卿拴,運(yùn)行1個(gè)測(cè)試用例衫仑,全部成功。
3.1.3clean
clean是maven工程的清理命令堕花,執(zhí)行 clean會(huì)刪除target目錄及內(nèi)容文狱。
3.1.4 package
package是maven工程的打包命令,對(duì)于java工程執(zhí)行package打成jar包航徙,對(duì)于web工程打成war包如贷。
3.1.5 install
install是maven工程的安裝命令,執(zhí)行install將maven打成jar包或war包發(fā)布到本地倉(cāng)庫(kù)到踏。
從運(yùn)行結(jié)果中杠袱,可以看出:
當(dāng)后面的命令執(zhí)行時(shí),前面的操作過(guò)程也都會(huì)自動(dòng)執(zhí)行窝稿,
3.0.6 Maven指令的生命周期
maven對(duì)項(xiàng)目構(gòu)建過(guò)程分為三套相互獨(dú)立的生命周期楣富,請(qǐng)注意這里說(shuō)的是“三套”,而且“相互獨(dú)立”伴榔,這三套生命周期分別是:
- Clean Lifecycle 在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作纹蝴。
- Default Lifecycle 構(gòu)建的核心部分庄萎,編譯,測(cè)試塘安,打包糠涛,部署等等。
- Site Lifecycle 生成項(xiàng)目報(bào)告兼犯,站點(diǎn)忍捡,發(fā)布站點(diǎn)。
3.1.7 maven的概念模型
Maven包含了一個(gè)項(xiàng)目對(duì)象模型 (Project Object Model)切黔,一組標(biāo)準(zhǔn)集合砸脊,一個(gè)項(xiàng)目生命周期(Project Lifecycle),一個(gè)依賴管理系統(tǒng)(Dependency Management System)纬霞,和用來(lái)運(yùn)行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯凌埂。- 項(xiàng)目對(duì)象模型 (Project Object Model)
一個(gè)maven工程都有一個(gè)pom.xml文件,通過(guò)pom.xml文件定義項(xiàng)目的坐標(biāo)诗芜、項(xiàng)目依賴瞳抓、項(xiàng)目信息、插件目標(biāo)等伏恐。 - 依賴管理系統(tǒng)(Dependency Management System)
通過(guò)maven的依賴管理對(duì)項(xiàng)目所依賴的jar 包進(jìn)行統(tǒng)一管理挨下。
比如:項(xiàng)目依賴junit4.9,通過(guò)在pom.xml中定義junit4.9的依賴即使用junit4.9脐湾,如下所示是junit4.9的依賴定義:<!-- 依賴關(guān)系 --> <dependencies> <!-- 此項(xiàng)目運(yùn)行使用junit臭笆,所以此項(xiàng)目依賴junit --> <dependency> <!-- junit的項(xiàng)目名稱 --> <groupId>junit</groupId> <!-- junit的模塊名稱 --> <artifactId>junit</artifactId> <!-- junit版本 --> <version>4.9</version> <!-- 依賴范圍:?jiǎn)卧獪y(cè)試時(shí)使用junit --> <scope>test</scope> </dependency> </dependencies>
-
一個(gè)項(xiàng)目生命周期(Project Lifecycle)
? 使用maven完成項(xiàng)目的構(gòu)建,項(xiàng)目構(gòu)建包括:清理秤掌、編譯愁铺、測(cè)試众雷、部署等過(guò)程独柑,maven將這些過(guò)程規(guī)范為一個(gè)生命周期,如下所示是生命周期的各各階段:
生命周期
maven通過(guò)執(zhí)行一些簡(jiǎn)單命令即可實(shí)現(xiàn)上邊生命周期的各各過(guò)程搜变,比如執(zhí)行mvn compile執(zhí)行編譯孟岛、執(zhí)行mvn clean執(zhí)行清理瓶竭。
- 一組標(biāo)準(zhǔn)集合
? maven將整個(gè)項(xiàng)目管理過(guò)程定義一組標(biāo)準(zhǔn),比如:通過(guò)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 管理項(xiàng)目生命周期過(guò)程都是基于插件完成的次询。
3.1 idea開(kāi)發(fā)maven項(xiàng)目
在實(shí)戰(zhàn)的環(huán)境中荧恍,我們都會(huì)使用流行的工具來(lái)開(kāi)發(fā)項(xiàng)目。
3.1.1 idea的maven配置
3.1.1.1 打開(kāi)File--->Settings-->配置maven
依據(jù)圖片指示,選擇本地maven安裝目錄送巡,指定maven安裝目錄下conf文件夾中settings配置文件摹菠。
3.1.2 idea中創(chuàng)建一個(gè)maven的web工程
打開(kāi)idea,選擇創(chuàng)建一個(gè)新工程
選擇idea提供好的maven的web工程模板
點(diǎn)擊Next填寫(xiě)項(xiàng)目信息
點(diǎn)擊Next骗爆,此處不做改動(dòng)次氨。
點(diǎn)擊Next選擇項(xiàng)目所在目錄
點(diǎn)擊Finish后開(kāi)始創(chuàng)建工程,耐心等待摘投,直到出現(xiàn)如下界面糟需。
手動(dòng)添加src/main/java目錄,如下圖右鍵main文件夾NewDirectory,創(chuàng)建一個(gè)新的文件夾命名為java
點(diǎn)擊OK后谷朝,在新的文件夾java上右鍵Make Directory as Sources Root
3.1.2.1 創(chuàng)建一個(gè)Servlet
src/java/main創(chuàng)建了一個(gè)Servlet,但報(bào)錯(cuò)
要解決問(wèn)題武花,就是要將servlet-api-xxx.jar包放進(jìn)來(lái)圆凰,作為maven工程應(yīng)當(dāng)添加servlet的坐標(biāo),從而導(dǎo)入它的jar
3.1.2.2 在pom.xml文件添加坐標(biāo)
直接打開(kāi)maven_demo工程的pom.xml文件体箕,再添加坐標(biāo)
添加jar包的坐標(biāo)時(shí)专钉,還可以指定這個(gè)jar包將來(lái)的作用范圍。
每個(gè)maven工程都需要定義本工程的坐標(biāo)累铅,坐標(biāo)是maven對(duì)jar包的身份定義跃须,比如:入門程序的坐標(biāo)定義如下:
<!--項(xiàng)目名稱,定義為組織名+項(xiàng)目名娃兽,類似包名-->
<groupId>cn.veliger</groupId>
<!--模塊名稱-->
<artifactId>maven_demo</artifactId>
<!--版本-->
<version>1.0-SNAPSHOT</version>
<!--打包類型 jar,war或者pom-->
<packaging>war</packaging>
3.1.2.3 坐標(biāo)的來(lái)源方式
添加依賴需要指定依賴jar包的坐標(biāo)菇民,但是很多情況我們是不知道jar包的的坐標(biāo),可以通過(guò)如下方式查詢:
3.1.2.3.1 從互聯(lián)網(wǎng)搜索
? http://search.maven.org/
? http://mvnrepository.com/
網(wǎng)站搜索示例:
3.1.3 依賴范圍
A依賴B投储,需要在A的pom.xml文件中添加B的坐標(biāo)第练,添加坐標(biāo)時(shí)需要指定依賴范圍,依賴范圍包括:
- compile:編譯范圍玛荞,指A在編譯時(shí)依賴B娇掏,此范圍為默認(rèn)依賴范圍。編譯范圍的依賴會(huì)用在編譯勋眯、測(cè)試婴梧、運(yùn)行,由于運(yùn)行時(shí)需要所以編譯范圍的依賴會(huì)被打包客蹋。
- provided:provided依賴只有在當(dāng)JDK或者一個(gè)容器已提供該依賴之后才使用塞蹭, provided依賴在編譯和測(cè)試時(shí)需要,在運(yùn)行時(shí)不需要讶坯,比如:servlet api被tomcat容器提供浮还。
- runtime:runtime依賴在運(yùn)行和測(cè)試系統(tǒng)的時(shí)候需要,但在編譯的時(shí)候不需要闽巩。比如:jdbc的驅(qū)動(dòng)包钧舌。由于運(yùn)行時(shí)需要所以runtime范圍的依賴會(huì)被打包担汤。
- test:test范圍依賴 在編譯和運(yùn)行時(shí)都不需要,它們只有在測(cè)試編譯和測(cè)試運(yùn)行階段可用洼冻,比如:junit崭歧。由于運(yùn)行時(shí)不需要所以test范圍依賴不會(huì)被打包。
-
system:system范圍依賴與provided類似撞牢,但是你必須顯式的提供一個(gè)對(duì)于本地系統(tǒng)中JAR文件的路徑率碾,需要指定systemPath磁盤路徑,system依賴不推薦使用屋彪。
43.jpg
在maven-demo工程中測(cè)試各各scop所宰。
測(cè)試總結(jié):
默認(rèn)引入 的jar包 ------- compile 【默認(rèn)范圍 可以不寫(xiě)】(編譯、測(cè)試畜挥、運(yùn)行 都有效 ) - servlet-api 仔粥、jsp-api ------- provided (編譯、測(cè)試 有效蟹但, 運(yùn)行時(shí)無(wú)效 防止和tomcat下jar沖突)
- jdbc驅(qū)動(dòng)jar包 ---- runtime (測(cè)試躯泰、運(yùn)行 有效 )
- junit ----- test (測(cè)試有效)
- 依賴范圍由強(qiáng)到弱的順序是:compile>provided>runtime>test
3.1.4 項(xiàng)目中添加的坐標(biāo)
3.1.5 設(shè)置jdk編譯版本
? 本教程使用jdk1.8,需要設(shè)置編譯版本為1.8华糖,這里需要使用maven的插件來(lái)設(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>
3.1.6 編寫(xiě)servlet
在src/main/java中創(chuàng)建ServletTest
package cn.veliger.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Description
*
* @author veliger@163.com
* @version 1.0
* @date 2019-03-13 10:26
**/
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/hello.jsp").forward(request,response);
}
}
3.1.7 編寫(xiě)jsp
在src/main/webapp下編寫(xiě)hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>mavenWeb工程學(xué)習(xí)</title>
</head>
<body>
<h4>歡迎學(xué)習(xí)maven系列教程</h4>
</body>
</html>
3.1.8 在web.xml中配置servlet訪問(wèn)路徑
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>servletDemo</servlet-name>
<servlet-class>cn.veliger.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo</servlet-name>
<url-pattern>/maven</url-pattern>
</servlet-mapping>
</web-app>
3.1.9 添加tomcat7插件
在pom文件中添加如下內(nèi)容
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
此時(shí)點(diǎn)擊idea最右側(cè)Maven Projects麦向,
就可以看到我們新添加的tomcat7插件
雙擊tomcat7插件下tomcat7:run命令直接運(yùn)行項(xiàng)目
3.1.10 運(yùn)行結(jié)果
第4章 maven工程運(yùn)行調(diào)試
4.1 端口占用處理
重新執(zhí)行tomcat:run命令重啟工程,重啟之前需手動(dòng)停止 tomcat客叉,否則報(bào)下邊的錯(cuò)誤:
第5章 總結(jié)
5.1 maven倉(cāng)庫(kù)
- maven倉(cāng)庫(kù)的類型有哪些诵竭?
- maven工程查找倉(cāng)庫(kù)的流程是什么?
- 本地倉(cāng)庫(kù)如何配置兼搏?
5.2 常用的maven命令
常用 的maven命令包括:
- compile:編譯
- clean:清理
- test:測(cè)試
- package:打包
- install:安裝
5.3 坐標(biāo)定義
在pom.xml中定義坐標(biāo)秀撇,內(nèi)容包括:groupId、artifactId向族、version呵燕,詳細(xì)內(nèi)容如下:
<!--項(xiàng)目名稱,定義為組織名+項(xiàng)目名件相,類似包名-->
<groupId>cn.veliger</groupId>
<!--模塊名稱-->
<artifactId>maven_demo</artifactId>
<!--版本-->
<version>1.0-SNAPSHOT</version>
<!--打包類型 jar,war或者pom-->
<packaging>war</packaging>
5.4 pom基本配置
pom.xml是Maven項(xiàng)目的核心配置文件再扭,位于每個(gè)工程的根目錄,基本配置如下:
- <project > :文件的根節(jié)點(diǎn) .
- <modelversion > : pom.xml使用的對(duì)象模型版本
- <groupId > :項(xiàng)目名稱夜矗,一般寫(xiě)項(xiàng)目的域名
- <artifactId > :模塊名稱泛范,子項(xiàng)目名或模塊名稱
- <version > :產(chǎn)品的版本號(hào) .
- <packaging > :打包類型,一般有jar紊撕、war罢荡、pom 等
- <name > :項(xiàng)目的顯示名,常用于 Maven 生成的文檔。
- <description > :項(xiàng)目描述区赵,常用于 Maven 生成的文檔
- <dependencies> :項(xiàng)目依賴構(gòu)件配置惭缰,配置項(xiàng)目依賴構(gòu)件的坐標(biāo)
- <build> :項(xiàng)目構(gòu)建配置,配置編譯笼才、運(yùn)行插件等漱受。