2019互聯(lián)網(wǎng)面試系列項(xiàng)目管理工具之Maven系列1

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ì)象模型 (POMProject 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)目如下:


沒(méi)有使用maven之前

原因主要是因?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ì)少很多直秆。如下圖:


使用maven之后

小結(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工程是如何使得工程變得很少呢抵恋?
分析如下:


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)建流程如下:


maven項(xiàng)目構(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è)面:
下載頁(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/
下載后的版本如下:
文件預(yù)覽

2.1.2 Maven軟件的安裝

Maven下載后买窟,將Maven解壓到一個(gè)沒(méi)有中文沒(méi)有空格的路徑下,比如D:\software\maven下面薯定。
解壓后目錄結(jié)構(gòu)如下:


目錄結(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環(huán)境變量配置

上面配置了我們的Maven軟件芽狗,注意這個(gè)目錄就是之前你解壓maven的壓縮文件包在的的目錄,最好不要有中文和空格锄贷。
再次檢查JDK的安裝目錄译蒂,如下圖:


jdk版本檢查

2.1.5 Maven軟件版本測(cè)試

通過(guò) mvn -v命令檢查 maven是否安裝成功,看到maven的版本為3.5.2及java版本為1.8即為安裝成功谊却。
找開(kāi)cmd命令柔昼,輸入mvn –v命令,如下圖:


maven版本查看

我們發(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ù)的類型:


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}/.m2/repository迅办,{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)有中文及空格的目錄下)榄鉴。


倉(cāng)庫(kù)位置

在MAVE_HOME/conf/settings.xml文件中配置本地倉(cāng)庫(kù)位置(maven的安裝目錄下):


setting文件

打開(kāi)settings.xml文件,配置如下:
setting文件修改

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} /.m2/settings.xml目錄中,{user.dir} 指windows 中的用戶目錄付魔。
? maven會(huì)先找用戶配置,如果找到則以用戶配置文件為準(zhǔn)飞蹂,否則使用全局配置文件几苍。

全局文件

2.3 Maven工程的認(rèn)識(shí)

2.3.1 Maven工程的目錄結(jié)構(gòu)

maven工程介紹

作為一個(gè)maven工程,它的src目錄和pom.xml是必備的陈哑。
進(jìn)入src目錄后妻坝,我們發(fā)現(xiàn)它里面的目錄結(jié)構(gòu)如下:


src目錄

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命令。

maven工程運(yùn)行

根據(jù)上邊的提示信息毁欣,通過(guò)瀏覽器訪問(wèn):http://localhost:8080/maven-helloworld/
瀏覽器瀏覽

2.3.3 問(wèn)題處理

如果本地倉(cāng)庫(kù)配置錯(cuò)誤會(huì)報(bào)下邊的錯(cuò)誤


沒(méi)有本地倉(cāng)庫(kù)運(yùn)行報(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,如下圖提示成功:


24.jpg

查看 target目錄坯约,class文件已生成熊咽,編譯完成。


25.jpg

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è)試用例衫仑,全部成功。


26.jpg

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ì)象模型
  • 項(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配置文件摹菠。


maven設(shè)置

3.1.2 idea中創(chuàng)建一個(gè)maven的web工程

打開(kāi)idea,選擇創(chuàng)建一個(gè)新工程


創(chuàng)建新工程

選擇idea提供好的maven的web工程模板


使用web模塊創(chuàng)建

點(diǎn)擊Next填寫(xiě)項(xiàng)目信息
項(xiàng)目信息

點(diǎn)擊Next骗爆,此處不做改動(dòng)次氨。


33.jpg

點(diǎn)擊Next選擇項(xiàng)目所在目錄
選擇項(xiàng)目位置

點(diǎn)擊Finish后開(kāi)始創(chuàng)建工程,耐心等待摘投,直到出現(xiàn)如下界面糟需。
創(chuàng)建項(xiàng)目

手動(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ò)


servlet項(xiàng)目報(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)站搜索示例:

網(wǎng)站搜索

網(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)目


Tomcat插件

3.1.10 運(yùn)行結(jié)果

運(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)行插件等漱受。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骡送,隨后出現(xiàn)的幾起案子昂羡,更是在濱河造成了極大的恐慌,老刑警劉巖摔踱,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虐先,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡派敷,警方通過(guò)查閱死者的電腦和手機(jī)蛹批,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膀息,“玉大人,你說(shuō)我怎么就攤上這事了赵∏敝В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵柿汛,是天一觀的道長(zhǎng)冗酿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)络断,這世上最難降的妖魔是什么裁替? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮貌笨,結(jié)果婚禮上弱判,老公的妹妹穿的比我還像新娘。我一直安慰自己锥惋,他們只是感情好昌腰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著膀跌,像睡著了一般遭商。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捅伤,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天劫流,我揣著相機(jī)與錄音,去河邊找鬼。 笑死祠汇,一個(gè)胖子當(dāng)著我的面吹牛仍秤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播座哩,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼徒扶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了根穷?” 一聲冷哼從身側(cè)響起姜骡,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屿良,沒(méi)想到半個(gè)月后圈澈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尘惧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年康栈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喷橙。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啥么,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贰逾,到底是詐尸還是另有隱情悬荣,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布疙剑,位于F島的核電站氯迂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏言缤。R本人自食惡果不足惜嚼蚀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望管挟。 院中可真熱鬧轿曙,春花似錦、人聲如沸僻孝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)皮璧。三九已至舟扎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悴务,已是汗流浹背睹限。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工譬猫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羡疗。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓染服,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叨恨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柳刮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容