Maven指南(一) - 兩小時(shí)從零到了解

目錄導(dǎo)航,方便大家選擇性查看

1 Maven 介紹


是什么

Maven是一個(gè)項(xiàng)目管理工具,它包含一個(gè)目標(biāo)對(duì)象模型POM(project Object Model),一個(gè)項(xiàng)目生命周期(Project Lifecycle),一個(gè)依賴管理系統(tǒng)(Dependency Management System)和用來(lái)運(yùn)行定義在生命周期階段中插件目標(biāo)的邏輯。

約定優(yōu)于配置

約定優(yōu)于配置是一個(gè)簡(jiǎn)單的概念,系統(tǒng)、類庫(kù)、框架給定一個(gè)合理的默認(rèn)值。Maven通過(guò)給項(xiàng)目提供默認(rèn)行為來(lái)融合這一概念,在沒(méi)有自定義的情況下

  • 源代碼放在:workspace/src/main/java
  • 資源文件放在:workspace/src/main/resources
  • 測(cè)試代碼放在:workspace/src/test
  • 字節(jié)碼文件放在:workspace/target/classes
  • 可發(fā)行的jar包放在:workspace/target

Maven和Ant的區(qū)別

Apache Ant

  • Ant 沒(méi)有正式的約定一個(gè)項(xiàng)目的目錄結(jié)構(gòu),你必須明確的告訴Ant哪里放源碼,哪里放字節(jié)碼等。
  • Ant 是程序化的,你必須告訴 Ant 做什么,什么時(shí)候做。
  • Ant 沒(méi)有生命周期,你必須定義目標(biāo)和目標(biāo)之間的依賴。

Apache Maven

  • Maven 擁有約定,遵守了約定, Maven 就知道你的源代碼放在了哪里。
  • Maven 是聲明式的。你只需要?jiǎng)?chuàng)建一個(gè) pom.xml 文件并將其放在默認(rèn)的目錄下, Maven 就會(huì)幫你干其他的事了。
  • Maven 擁有生命周期,當(dāng)你運(yùn)行相應(yīng)的命令后就會(huì)被調(diào)用,這條命令會(huì)告訴 Maven 執(zhí)行一系列的有序步驟, 直到達(dá)到指定的生命周期。

2 Maven 安裝


Maven安裝

安裝自行解決??,有問(wèn)題下方留言

安裝及環(huán)境變量設(shè)置成功顯示

  • java -version
  • mvn -v
環(huán)境變量設(shè)置成功

Maven目錄及配置說(shuō)明

我們先打開安裝好的 Maven目錄看看。

maven 目錄

其中:

  • bin目錄:包含了運(yùn)行 Maven 的一些腳本。
  • boot目錄:包含了一個(gè)負(fù)責(zé)創(chuàng)建 Maven 運(yùn)行所需要的類加載器的 jar 文件 。
  • conf目錄:包含了一個(gè)全局的 settings.xml 文件,該配置文件用來(lái)自定義你電腦上的 Maven 的行為。如果我們要自定義 Maven,我們通常會(huì)將該配置文件覆蓋掉 ~/.m2目錄下的 settings.xml 文件。
  • lib目錄:包含了 Maven的核心jar包。
  • LICENSE:包含了 Apache Maven 的軟件許可證。
  • NOTICE:包含了 Maven 依賴的類庫(kù)所需要的通告及權(quán)限。
  • README.txt:包含了一些安裝指令

接著我們?cè)賮?lái)看看本地的 Maven 倉(cāng)庫(kù),進(jìn)入~/.m2目錄

本地 maven 倉(cāng)庫(kù)

其中:

  • settings.xml:包含了用戶的相關(guān)憑證,倉(cāng)庫(kù)和其它信息的配置。
  • repository目錄:本地倉(cāng)庫(kù),當(dāng)從maven遠(yuǎn)程倉(cāng)庫(kù)下載jar依賴的時(shí)候,會(huì)自動(dòng)下載到該目錄下。

3 第一個(gè)demo


當(dāng)我們把maven環(huán)境搭建好之后,我們來(lái)創(chuàng)建一個(gè)maven項(xiàng)目。

1) 創(chuàng)建 maven 項(xiàng)目

mvn archetype:create 
                -DgroupId=org.sonatype.mavenbook.ch03 //項(xiàng)目id
                -DartifactId=demo //項(xiàng)目名
                -DpackageName=com.acey.demo  //包的目錄結(jié)構(gòu)

注意

  • 第一次創(chuàng)建maven項(xiàng)目會(huì)自動(dòng)下載很多jar包。
  • 如果你的 maven 版本是
  • 2.x,使用命令mvn archetype:create創(chuàng)建maven項(xiàng)目
  • 3.x,使用命令mvn archetype:generate創(chuàng)建maven項(xiàng)目
  • 如果運(yùn)行上面的命令出現(xiàn)卡死
    卡死

    那么需要加上參數(shù)-DarchetypeCatalog=internal,讓maven 不要從遠(yuǎn)程服務(wù)器上獲取catalog。
mvn archetype:generate
                -DgroupId=org.sonatype.mavenbook.ch03 //項(xiàng)目id
                -DartifactId=demo //項(xiàng)目名
                -DpackageName=com.acey.demo  //包的目錄結(jié)構(gòu)
                -DarchetypeCatalog=internal

一切順利的話,我們便可以在當(dāng)前目錄下找到我們創(chuàng)建的 maven 項(xiàng)目了,打開后可以看到項(xiàng)目的目錄結(jié)構(gòu)。


demo 目錄結(jié)構(gòu)

2)mvn install

在項(xiàng)目跟路經(jīng)下執(zhí)行 mvn install命令

mvn install
install 步驟

可以先看下整個(gè)執(zhí)行步驟,詳情會(huì)在后面的 maven 生命周期中詳細(xì)介紹。

3)運(yùn)行

java -cp target/demo-1.0-SNAPSHOT.jar com.acey.demo.App
結(jié)果

4 核心概念


1)Maven 插件和目標(biāo)(Plugins and Goals)

一個(gè) Maven 插件(plugin)是一個(gè)或多個(gè)目標(biāo)(goal)的集合。而一個(gè)目標(biāo)是 Maven 中的一個(gè)工作單元(unit of work),他可以作為以個(gè)單獨(dú)的目標(biāo)運(yùn)行,也可以作為一個(gè)大的構(gòu)建的一部分和其它目標(biāo)一起運(yùn)行。用以下格式表示:

pluginId:goalId

在我們構(gòu)建 Maven 項(xiàng)目時(shí),我們便用到了archetype插件和generate目標(biāo)。當(dāng)然目標(biāo)也是可以定義一些參數(shù)。

mvn archetype(插件):generate(目標(biāo))
                -DgroupId=org.sonatype.mavenbook.ch03 //目標(biāo)參數(shù)
                -DartifactId=demo //目標(biāo)參數(shù)
                -DpackageName=com.acey.demo  //目標(biāo)參數(shù)
                -DarchetypeCatalog=internal //目標(biāo)參數(shù)

2)生命周期(Lifecycle)

Maven有三套相互獨(dú)立的生命周期

  • Clean Lifecycle:在真正的構(gòu)建之前進(jìn)行項(xiàng)目的清理工作
  • Default Lifecycle:構(gòu)建的核心部分,包含編譯、測(cè)試、打包、部署等。
  • Site Lifecycle:生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)。

其中:
Default Lifecycle包含了一系列階段的序列。

一系列階段的序列

插件目標(biāo)也是可以附著在生命周期上的,它會(huì)隨著生命周期的移動(dòng),執(zhí)行附著在不同生命周期上的目標(biāo)。每個(gè)階段上附著的零個(gè)或多個(gè)目標(biāo)。例如:放我們執(zhí)行 mvn package時(shí),我們會(huì)發(fā)現(xiàn)它會(huì)默認(rèn)的執(zhí)行該生命周期前的生命周期所對(duì)應(yīng)的目標(biāo),當(dāng)達(dá)到目標(biāo)生命周期(package)時(shí),會(huì)執(zhí)行附著在package上的jar:jar進(jìn)行打包。

mvn package

我們?cè)賮?lái)看看每個(gè)周期所對(duì)應(yīng)的目標(biāo)

周期對(duì)應(yīng)目標(biāo)

mvn package 會(huì)自動(dòng)執(zhí)行它前面周期所對(duì)應(yīng)的目標(biāo),然后打包
mvn jar:jar 只會(huì)打包


Clean Lifecycle一共包含三個(gè)階段

  • pre-clean:執(zhí)行一些需要在 clean 之前完成的任務(wù)
  • clean:移除所有上次構(gòu)建所生成的文件
  • post-clean:執(zhí)行一些需要在 clean 之后完成的任務(wù)

Site Lifecycle一共包含了四個(gè)階段

  • pre-site:執(zhí)行了一些需要在生成報(bào)告站點(diǎn)之前完成的工作
  • site:生成項(xiàng)目的站點(diǎn)文檔
  • post-site:執(zhí)行一些需要在生成報(bào)告站點(diǎn)之后完成的任務(wù)
  • site-deploy:將生成的站點(diǎn)文檔部署到遠(yuǎn)程服務(wù)器

當(dāng)我們執(zhí)行mvn site后,我們會(huì)發(fā)現(xiàn)我們的 target 目錄下會(huì)生成一個(gè) site 目錄,里面包含了項(xiàng)目的各種報(bào)告。

mvn site

3)Maven 坐標(biāo)(Coordinates)

Maven坐標(biāo)定義了一組標(biāo)識(shí),它可以用來(lái)唯一標(biāo)識(shí)一個(gè)項(xiàng)目,一個(gè)依賴,或者是一個(gè)POM里面的插件。我們先來(lái)看一個(gè)簡(jiǎn)單的POM。

pom

其中 groupId、artfiactId、versionpackaging共同組成了項(xiàng)目的坐標(biāo),Maven通過(guò)一個(gè)坐標(biāo)來(lái)定位一個(gè)項(xiàng)目,Maven 坐標(biāo)一般會(huì)用冒號(hào)作為分隔符來(lái)書寫。

groupId:artifactId:packaging:version

在上圖的項(xiàng)目坐標(biāo)就可以表示為:

testdemo:demo:jar:1.0-SNAPSHOT

當(dāng)然這個(gè)符號(hào)也應(yīng)用于項(xiàng)目依賴,上圖項(xiàng)目中依賴了 JUnit的3.8.1版本,那么它就包含了一個(gè)junit:junit:jar:3.8.1的依賴。

  • groupId:表示一個(gè)團(tuán)體標(biāo)識(shí),它一般以創(chuàng)建這個(gè)項(xiàng)目的組織名稱的逆向域名(version domain name)開頭。比如 Apache Software 就以·org.apache·作為 groupId。
  • artifactId:在 groupId 下的表示一個(gè)單獨(dú)項(xiàng)目的唯一標(biāo)識(shí),一般為項(xiàng)目名。
  • version:一個(gè)項(xiàng)目的特定版本。如果是正在開發(fā)中的項(xiàng)目那么一般會(huì)加上一個(gè)特殊的標(biāo)識(shí),在版本號(hào)前加上 “SNAPSHOT"的標(biāo)記。
  • package:項(xiàng)目的類型,默認(rèn)為jar,描述了項(xiàng)目打包后的輸出格式。也可以打包成一個(gè) war。

4)Maven 倉(cāng)庫(kù)(Repositories)

當(dāng)我們?cè)谶\(yùn)行 Maven 項(xiàng)目的時(shí)候,Maven 會(huì)從 pom.xml 中查找已配置的插件坐標(biāo),然后在本地倉(cāng)庫(kù)中查找是否有對(duì)應(yīng)的插件,如果沒(méi)有那么就會(huì)從 Maven 自帶的遠(yuǎn)程倉(cāng)庫(kù)http://repo1.maven.org/maven2 中下載所需要的插件緩存到本地倉(cāng)庫(kù)。本地倉(cāng)庫(kù)的默認(rèn)地址:

  • window中:* C:\Users\USERNAME.m2\repository*
  • linux中:~/.m2/repository

如果我們有需要的話也是可以修改本地倉(cāng)庫(kù)的地址

  • 更改配置用戶范圍的本地倉(cāng)庫(kù):
  • 在 /.m2/ 目錄下創(chuàng)建一個(gè)setting.xml或者將M2_HOME/conf/settings.xml拷過(guò)來(lái)
  • 在 setting.xml 中添加以下節(jié)點(diǎn)。
<settings>  
    <localRepository>新的倉(cāng)庫(kù)地址</localRepository>  
</settings> 
  • 更改配置全局范圍的本地倉(cāng)庫(kù)
  • 直接在M2_HOME/conf/settings.xml添加以下節(jié)點(diǎn)
<settings>  
    <localRepository>新的倉(cāng)庫(kù)地址</localRepository>  
</settings> 

當(dāng) Maven升級(jí)后,所有的配置都將會(huì)被清除,所以一般不推薦修改全局的配置


Maven插件存儲(chǔ)結(jié)構(gòu)

在我們打開本地倉(cāng)庫(kù)(repository) 后,我們會(huì)看到很多的插件,Maven 倉(cāng)庫(kù)會(huì)按以下目錄格式來(lái)存儲(chǔ)插件。

/< groupId >/< artifactId >/< version >/< artifactId >-<version>.< packaging >

比如 c3p0-0.9.1.2.jar的存儲(chǔ)方式

c3p0

當(dāng)我們用mvn install對(duì)項(xiàng)目進(jìn)行install時(shí),Maven 也會(huì)按上述的格式將所生成的jar/war包保存在倉(cāng)庫(kù)中作為依賴插件。

5)Maven 依賴管理(Dependency Management)

所謂依賴就是項(xiàng)目中使用了一些插件,當(dāng)我們需要運(yùn)行項(xiàng)目時(shí),我們必須將相應(yīng)的插件加進(jìn)來(lái)。而 Maven 依賴管理則是將所需要的插件下載到本地倉(cāng)庫(kù),當(dāng)我們需要使用插件時(shí),只需要在 pom.xml 中去配置相關(guān)的依賴即可。

pom.xml

可以看到我們需要加一個(gè)依賴也是很簡(jiǎn)單,只需要在 pom.xml 中在 dependencies 下加一個(gè) dependency 即可,其中 groupIdartifactIdversion決定了 junit的坐標(biāo),而 scope 則表示junit的作用范圍,test 表示只有項(xiàng)目在執(zhí)行 compiler:testCompilesurefire:test目標(biāo)的時(shí)候才會(huì)被加入到 classpath中。

幾個(gè) scope 范圍

  • compile,缺省值,適用于所有階段,會(huì)隨著項(xiàng)目一起發(fā)布。
  • provided,類似compile,期望JDK、容器或使用者會(huì)提供這個(gè)依賴。如servlet.jar。
  • runtime,只在運(yùn)行時(shí)使用,如JDBC驅(qū)動(dòng),適用運(yùn)行和測(cè)試階段。
  • test,只在測(cè)試時(shí)使用,用于編譯和運(yùn)行測(cè)試代碼。不會(huì)隨項(xiàng)目發(fā)布。
  • system,類似provided,需要顯式提供包含依賴的jar,Maven不會(huì)在Repository中查找它。

Maven 的基礎(chǔ)概念就差不多啦,大家有疑問(wèn)的話可以在下方留言哦。??
下一篇會(huì)講講實(shí)戰(zhàn)和更深層次的內(nèi)容。
(? ω ?)喜歡的話點(diǎn)個(gè)?唄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容