項(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-clean
和clean
階段放案,而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
雇寇、com
、cn
等等許多,其中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ò)誤(無法找到依賴的文件)。