Maven基本原理

項(xiàng)目構(gòu)建原理

Maven是一種常用的項(xiàng)目構(gòu)建工具惫撰,項(xiàng)目構(gòu)建工具將我們在軟件開發(fā)中中的一些重復(fù)又易出錯(cuò)的固定活動(dòng)羔沙,如編碼,加載依賴厨钻,編譯扼雏,測試,打包夯膀,發(fā)布等管理起來诗充,開發(fā)人員只要是用項(xiàng)目構(gòu)建工具的一些簡單的命令,就可以完成這些活動(dòng)诱建。

因此蝴蜓,項(xiàng)目構(gòu)建工具主要做下面三件事

  • 規(guī)范并完善一個(gè)完整的構(gòu)建生命周期模型,標(biāo)準(zhǔn)化構(gòu)建過程俺猿。
  • 有效的依賴管理與版本管理茎匠。
  • 為統(tǒng)一,標(biāo)準(zhǔn)的配置提供一套規(guī)范押袍。

作為常用的項(xiàng)目構(gòu)建工具诵冒,Maven能夠基于POM來提供除了項(xiàng)目構(gòu)建生命周期的管理之外的版本管理,是Java構(gòu)建管理的第二代產(chǎn)品谊惭,它提出了一個(gè)很重要的概念就是約定大于配置造烁,即按照約定成俗的構(gòu)建生命周期來構(gòu)建項(xiàng)目。

通過以下對(duì)Maven生命周期午笛,配置文件惭蟋,倉庫等的介紹,我們可以理解Maven的構(gòu)建原理药磺。

生命周期

Maven 有以下三個(gè)標(biāo)準(zhǔn)的生命周期:

  • clean:項(xiàng)目清理的處理
  • default(或 build):項(xiàng)目部署的處理
  • site:項(xiàng)目站點(diǎn)文檔創(chuàng)建的處理

clean

clean的主要目的是清空項(xiàng)目工作中產(chǎn)生的一些中間件告组,比如上次打的jar包,臨時(shí)文件等癌佩。該生命周期主要用于在build生命周期之前做清理工作木缝。
clean生命周期包含三個(gè)階段:

階段 處理 描述
pre-clean 預(yù)清理 執(zhí)行一些需要在clean之前完成的工作
clean 清理 移除所有上一次構(gòu)建生成的文件
post-clean 后清理 執(zhí)行一些需要在clean之后立刻完成的工作

在一個(gè)生命周期中便锨,運(yùn)行某個(gè)階段的時(shí)候,它之前的所有階段都會(huì)被運(yùn)行我碟,因此maven clean命令會(huì)執(zhí)行pre-cleanclean階段放案,而mvn post-clean命令會(huì)執(zhí)行clean生命周期的三個(gè)階段:pre-clean, clean, post-clean

default (build)

build(構(gòu)建)聲明周期是maven的主要生命周期矫俺,主要用于構(gòu)建應(yīng)用吱殉。包括23個(gè)階段,下面介紹常用的7種:

階段 處理 描述
validate 驗(yàn)證項(xiàng)目 驗(yàn)證項(xiàng)目是否正確且所有必須信息是可用的
compile 執(zhí)行編譯 源代碼編譯在此階段完成
test 測試 使用適當(dāng)?shù)膯卧獪y試框架運(yùn)行測試厘托。
package 打包 將編譯后的代碼打包成需要的格式友雳,比如JAR
verify 檢查 對(duì)集成測試的結(jié)果進(jìn)行檢查,以保證質(zhì)量達(dá)標(biāo)
install 安裝 安裝打包的項(xiàng)目到本地倉庫铅匹,以供其他項(xiàng)目使用
deploy 部署 將在最終的build環(huán)境上面完成押赊,拷貝最終的工程包到遠(yuǎn)程倉庫中,
以共享給其他開發(fā)人員和工程

site

Maven Site 插件一般用來創(chuàng)建新的報(bào)告文檔包斑、部署站點(diǎn)等流礁。

階段 處理
pre-site 執(zhí)行一些需要在生成站點(diǎn)文檔之前完成的工作
site 生成項(xiàng)目的站點(diǎn)文檔
post-site 執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備
site-deploy 將生成的站點(diǎn)文檔部署到特定的服務(wù)器上

經(jīng)常用到的是site階段和site-deploy階段罗丰,用以生成和發(fā)布Maven站點(diǎn)崇棠。

構(gòu)建配置文件

構(gòu)建配置文件的類型

構(gòu)建配置文件大體上有三種類型:

類型 在哪定義
項(xiàng)目級(jí)(Per Project) 定義在項(xiàng)目的POM文件pom.xml中
用戶級(jí) (Per User) 定義在Maven的設(shè)置xml文件中(%USER_HOME%/.m2/settings.xml)
全局(Global) 定義在 Maven 全局的設(shè)置 xml 文件中(%M2_HOME%/conf/settings.xml)

下面介紹POM文件配置

POM配置

在項(xiàng)目的根目錄下面有個(gè)pom.xml的文件,該文件是用來配置Maven項(xiàng)目的丸卷,其中包括版本枕稀,生命周期,構(gòu)建過程谜嫉,依賴等的配置萎坷。

版本

在創(chuàng)建Maven項(xiàng)目的時(shí)候,需要手動(dòng)指定GroupId沐兰,ArtifactId, Version哆档,這就是項(xiàng)目的版本配置。

  • GroupId :是項(xiàng)目組織中唯一的標(biāo)識(shí)符住闯,對(duì)應(yīng)Java包結(jié)構(gòu)瓜浸,在idea中看到的是main目錄里java的目錄結(jié)構(gòu)。一般分為多個(gè)段比原,這里我只說兩段插佛,第一段為域,第二段為公司名稱量窘。域又分為org雇寇、comcn等等許多,其中org為非營利組織锨侯,com為商業(yè)組織嫩海。
  • ArtifactId: 是項(xiàng)目的唯一的標(biāo)識(shí)符,實(shí)際對(duì)應(yīng)項(xiàng)目的名稱(就是idea中工程的名字)囚痴,就是項(xiàng)目根目錄的名稱叁怪。
  • Version: 是該項(xiàng)目的版本信息。
    如下是我創(chuàng)建的demo項(xiàng)目的版本配置:
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>

生命周期配置

Maven一般是通過約定大于配置的方式來約定整個(gè)生命周期的深滚,但是也可以通過在POM文件里面的配置來指定其構(gòu)建過程奕谭。
比如將 maven-antrun-plugin:run 目標(biāo)添加到 pre-clean、clean 和 post-clean 階段中成箫。這樣我們可以在 clean 生命周期的各個(gè)階段顯示文本信息。

構(gòu)建命令

Maven命令通常有兩部分構(gòu)成:

  • mvn
  • 1或多個(gè)構(gòu)建生命周期旨枯,構(gòu)建階段蹬昌,或構(gòu)建目標(biāo)
    如:
mvn clean

多個(gè)構(gòu)建過程寫在一條命令里,則按順序執(zhí)行攀隔,如下先執(zhí)行clean再執(zhí)行build:

mvn clean build
  • 連接
    30個(gè)常用maven命令

  • 在命令行使用皂贩、maven構(gòu)建命令時(shí),命令行窗口位置應(yīng)切換到項(xiàng)目pom文件所在目錄昆汹,也即項(xiàng)目的根目錄



    另外明刷,在idea中,View --> Tool Windows --> maven满粗,在打開的窗口中辈末,我們可以看到上面提到的maven常用的生命周期的幾個(gè)階段,點(diǎn)擊即可執(zhí)行映皆。


依賴配置

在POM里面的dependencies下面添加依賴配置挤聘。
如下是我的demo項(xiàng)目的pom中引入的依賴:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

配置文件在倉庫中尋找,下面就來介紹倉庫捅彻。

倉庫

在Maven中组去,倉庫是用來存放依賴文件的地方,是依賴管理的重要組成部分步淹。倉庫按照存放位置可以分為本地倉庫从隆,遠(yuǎn)程倉庫以及中央倉庫

本地倉庫

本地倉庫缭裆,就是本地開發(fā)自己機(jī)器上的倉庫键闺。在idea的settings中我們可以查看自己本地倉庫的位置。


中央倉庫

Maven 中央倉庫是由 Maven 社區(qū)提供的倉庫澈驼,其中包含了大量常用的庫艾杏。

中央倉庫的關(guān)鍵概念:

  • 這個(gè)倉庫由 Maven 社區(qū)管理。
  • 不需要配置。
  • 需要通過網(wǎng)絡(luò)才能訪問购桑。

遠(yuǎn)程倉庫

當(dāng)條件限制畅铭,不允許在中央倉庫下載依賴,那么組織可以自己定制一個(gè)遠(yuǎn)程倉庫勃蜘,讓所有開發(fā)都從此倉庫下載硕噩。定義好遠(yuǎn)程倉庫后,然后修改POM文件即可:

<repositories>
  <repository>
    <id>companyname.lib1</id>
    <url>http://download.companyname.org/maven2/lib1</url>
  </repository>
  <repository>
    <id>companyname.lib2</id>
    <url>http://download.companyname.org/maven2/lib2</url>
  </repository>
</repositories>

依賴下載順序

當(dāng)我們執(zhí)行 Maven 構(gòu)建命令時(shí)缭贡,Maven 開始按照以下順序查找依賴的庫:

  • 步驟 1 - 在本地倉庫中搜索炉擅,如果找不到,執(zhí)行步驟 2阳惹,如果找到了則執(zhí)行其他操作谍失。
  • 步驟 2 - 在中央倉庫中搜索,如果找不到莹汤,并且有一個(gè)或多個(gè)遠(yuǎn)程倉庫已經(jīng)設(shè)置快鱼,則執(zhí)行步驟 4,如果找到了則下載到本地倉庫中以備將來引用纲岭。
  • 步驟 3 - 如果遠(yuǎn)程倉庫沒有被設(shè)置抹竹,Maven 將簡單的停滯處理并拋出錯(cuò)誤(無法找到依賴的文件)。
  • 步驟 4 - 在一個(gè)或多個(gè)遠(yuǎn)程倉庫中搜索依賴的文件止潮,如果找到則下載到本地倉庫以備將來引用窃判,否則 Maven 將停止處理并拋出錯(cuò)誤(無法找到依賴的文件)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喇闸,一起剝皮案震驚了整個(gè)濱河市袄琳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燃乍,老刑警劉巖跨蟹,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異橘沥,居然都是意外死亡窗轩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門座咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痢艺,“玉大人,你說我怎么就攤上這事介陶〉淌妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵哺呜,是天一觀的道長舌缤。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么国撵? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任陵吸,我火速辦了婚禮,結(jié)果婚禮上介牙,老公的妹妹穿的比我還像新娘壮虫。我一直安慰自己,他們只是感情好环础,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布囚似。 她就那樣靜靜地躺著,像睡著了一般线得。 火紅的嫁衣襯著肌膚如雪饶唤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天贯钩,我揣著相機(jī)與錄音募狂,去河邊找鬼。 笑死魏保,一個(gè)胖子當(dāng)著我的面吹牛熬尺,可吹牛的內(nèi)容都是我干的摸屠。 我是一名探鬼主播谓罗,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼季二!你這毒婦竟也來了檩咱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤胯舷,失蹤者是張志新(化名)和其女友劉穎刻蚯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桑嘶,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炊汹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逃顶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讨便。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖以政,靈堂內(nèi)的尸體忽然破棺而出霸褒,到底是詐尸還是另有隱情,我是刑警寧澤盈蛮,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布废菱,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏殊轴。R本人自食惡果不足惜衰倦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梳凛。 院中可真熱鬧耿币,春花似錦、人聲如沸韧拒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叛溢。三九已至塑悼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楷掉,已是汗流浹背厢蒜。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烹植,地道東北人斑鸦。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像草雕,于是被迫代替她去往敵國和親巷屿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345