依賴管理,倉庫及構建生命周期
依賴配置
在之前的筆記中,我們詳細的給出了依賴聲明的語法規則,其中,最重要的,就是依賴坐標。
其中還有一個元素,<scope>,它表示的是依賴作用的范圍,常見的值有compile(默認),provided。
<scope>provided</scope>
compile:編譯時需要,打包時也會一并包含在內。
provided:僅編譯時需要。對于容器會提供的環境依賴文件,我們一般采用provided。
對于用于繼承的父pom來說,還有一個元素需要配置,那就是<dependencyMangment>,它包裹在<dependencies>標簽外。
那么我們的依賴項,會到哪里去尋找呢?
倉庫
Maven倉庫是一個用于統一存儲所有Maven項目共享構件的空間。
倉庫按照位置可以分為兩類:
- 本地倉庫:用于緩存依賴。默認路徑為${user.home}/.m2/repository
- 遠程倉庫:存放在服務器的倉庫,提供maven項目訪問并下載構件至本地倉庫。通過項目坐標,可以訪問到存放在遠程倉庫的依賴。
已經緩存到本地的依賴,再次使用時可以直接調用,節約帶寬。訪問倉庫時,本地倉庫優先查找。
遠程倉庫按照作用不同,可以分為以下幾類:
- 中央倉庫 The Central Repository,包含絕大部分開源項目。默認沒有任何配置的話,就會從中央倉庫查詢。
- 其他公共倉庫 開源中國社區,一般提供了一個maven的鏡像庫,加速訪問。
- 私服 如公司內部倉庫(artifactory),這樣對于一些私人項目,也可以托管到私服中。
遠程倉庫的配置:使用配置文件settings.xml或者在項目的pom.xml中為依賴指定<respositories>屬性,這樣配置,僅對設置的項目生效。
構建生命周期
一個構建生命周期是一組精心組織的有序的階段,每一個階段執行預先定義的"動作",比如:
- 編譯
- 打包
- 部署
- ...
這些動作會根據不同的項目類型,會自動的進行選擇。
Maven有三套獨立的互不干涉的生命周期:
- clean -> pre-clean -> clean -> post-clean
clean主要用來刪除項目構建的輸出,比如架包,class文件等。
mvn clean
- defalut -> ... -> process-resources -> complie -> ... -> test -> package -> install -> deploy
mvn clean install//兩個生命周期
- site -> pre-site -> site -> post-site -> site-deploy
site生命周期主要用來生成站點文檔,主要用于開源項目,可以與java docker一起使用。
默認生命周期
default生命周期,是我們的項目構建過程中的整體模型,我們只關注寫出來的階段。
- validate:檢測我們的項目配置是否正確,用來構建項目的信息是否完整。
- process-resources:復制資源文件。
- test:單元測試
- package:打包成jar或者war
- install:將包安裝到我們的本地倉庫,這樣在本地開發時,如果有別的項目依賴本項目,就可以直接查找了。
- deploy:將war包上傳到遠程倉庫。
插件和目標
maven是一個插件式的架構,由一個很小的引擎,配上很多插件構成的。
所有的插件本身也是一個maven構建,由mavem倉庫進行管理。
maven的所有功能實際上都是由插件提供的。
每一個插件提供多個目標(Goal)。
調用目標的格式:
mvn <plugin>:<Goal>
插件目標綁定構建生命周期
插件在maven的生命周期中占據了很重要的地位,生命構建階段與目標綁定,當我們在調用maven生命周期時,實際上執行的是maven的插件目標。
用戶通過指定生命周期階段就能隱式的通過插件執行任務。
命令與目標的對應關系:
process-resources resources:resources
compile compiler:compile
test surefire:test
install install:install
deploy deploy:deploy
對于package階段,會根據項目類型的不同,綁定到不同的目標之上。
插件配置
插件除了有定位的坐標外,還有一個<configuration>元素,用來配置插件。
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
我們可以通過一個命令來查看插件支持的所有配置項:
mvn help:describe -Dplugin=<plugin_name> -Dgoal=<goal> -Ddetail
插件配置的具體內容,我們將會在下一份筆記中為大家展出~