Maven 3 入門 -- 核心概念
坐標
例如上篇helloworld的pom.xml配置文件中的
<groupId>com.zhaoyang</groupId>
<artifactId>HelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>
其實就是坐標,那么Maven的坐標元素包括groupId、artifactId、version、packaging、classifier
當一個項目通過依賴,插件或者父項目引用和另外一個項目關聯的時候,Maven通過坐標來精確定位一個項目。
groupId: 團體,公司,小組,組織,項目,或者其它團體。團體標識的約定是,它以創
建這個項目的組織名稱的逆向域名開頭。
artifactId: 在groupId下的表示一個單獨項目的唯一標識符
version: 定義項目的版本
packaging:打包方式,比如:jar或者war,默認是jar
classifier: 表示構件的jdk版本,我們不能直接定義
---------------------------------------------------------------------------------------------------------------------------------
我們把開始的HelloWorld項目安裝到本地倉庫,運行mvn clean install
那么現在去本地倉庫目錄下查看那個項目,我們就可以理解坐標在倉庫中的構成
如下圖:

注:maven的坐標并不僅僅只是指一個對應的jar文件,而是包括它的依賴等等等等,我們通過坐標可以精確的定位到這個maven項目。
Maven的生命周期(Life Cycle)
什么是生命周期?
生命周期是指我們對項目的清理,初始化,編譯,測試,打包,集成測試,驗證,部署,站點生產等等一系列的流程,但是每個公司都是用不同的方式來來做這些同樣的事情,那么Maven它就給我們把這些過程(稱為構建過程)進行了抽象和統一
Maven有三套獨立的生命周期,它們分別是clean , default, site
1) clean 生命周期是用于清理項目 (默認是刪除了target文件夾)
2) default 生命周期是用于構建項目
3) site 生命周期是是用于建立項目站點
clean生命周期
|
pre-clean |
清理之前的準備 |
|
clean |
進行清理工作,通常是干掉target文件夾 |
|
post-clean |
清理之后的準備工作 |
default生命周期
|
validate |
驗證項目是否正確,以及所有為了完整構建必要的信息是否可用 |
|
initialize |
|
|
generate-sources |
生成所有需要包含在編譯過程中的源代碼 |
|
process-sources |
處理源代碼,比如過濾一些值 |
|
generate-resources |
生成所有需要包含在打包過程中的資源文件 |
|
process-resources |
復制并處理資源文件至目標目錄,準備打包 |
|
compile |
編譯項目的源代碼 |
|
process-classes |
處理編譯生成的文件,例如對Java類進行字節碼增強 |
|
generate-test-sources |
生成所有包含在測試編譯過程中的測試源碼 |
|
process-test-sources |
處理測試源碼,比如過濾一些值 |
|
generate-test-resources |
生成測試需要的資源文件 |
|
process-test-resources |
復制并處理測試資源文件至測試目標目錄 |
|
test-compile |
編譯測試源碼至測試目標目錄 |
|
process-test-classes |
|
|
test |
使用合適的單元測試框架運行測試,這些測試應該不需要代碼被打包或發布 |
|
prepare-package |
在真正的打包之前,執行一些準備打包必要的操作 |
|
package |
將編譯好的代碼打包成可分發的格式,如JAR,WAR,或者EAR |
|
pre-integration-test |
執行一些在集成測試運行之前需要的動作,如建立集成測試需要的環境 |
|
integration-test |
如果有必要的話,處理包并發布至集成測試可以運行的環境 |
|
post-integration-test |
執行一些在集成測試運行之后需要的動作,如清理集成測試環境。 |
|
verify |
執行所有檢查,驗證包是有效的,符合質量規范 |
|
install |
安裝包至本地倉庫,以備本地的其它項目作為依賴使用 |
|
deploy |
復制最終的包至遠程倉庫,共享給其它開發人員和項目 |
site生命周期
|
pre-site |
|
|
site |
|
|
post-site |
|
|
site-deploy |
|
注:在每個生命周期的不同階段,如果執行了后面階段的,前面的就會自動執行
比如我們執行
mvn clean 就相當于執行了 pre-clean 以及 clean
mvn test 就相當于執行了 validate --> initialize --> … -->compile-->…--->test
倉庫
在Maven世界中,任何一個依賴、插件或者項目的構建輸出,都可以稱為構件。任何一個構件都有一組坐標唯一標識。
得益于坐標機制,任何Maven項目使用任何一個構件的方式都是完全相同的。在此基礎上,Maven可以在某個位置統一存儲所有Maven項目共享的構件,這個統一的位置就是倉庫。
對于Maven來說,倉庫只分為兩大類:本地倉庫和遠程倉庫。當Maven根據坐標尋找構件的時候,它首先會查看本地倉庫,如果本地倉庫存在此構件,則直接使用;如果本地倉庫部存在此構件,Maven就會去遠程倉庫查找,發現需要的構件之后,下載到本地倉庫再使用。
依賴管理(maven最強大的特性)
什么是依賴管理(Dependency Management)?
簡單的說,比如我們的java項目一般都是會依賴其他的包,在maven的世界里,這些被依賴的包被稱為dependency,就如開始我們配置文件中配置的一樣,而dependency又是其他工程的坐標。
依賴的傳遞性(Transitive Dependencies)
在Maven中一個依賴不僅僅是一個JAR。它是一個POM文件,這個POM可能也聲明了對其它構件的依賴。這些依賴的依賴叫做傳遞性依賴,Maven倉庫不僅僅存貯二進制文件,也存儲了這些構建的元數據(metadata)
比如假如你的項目依賴于一個庫,而這個庫又依賴于五個或者十個其它的庫(就像Spring或者Hibernate那樣)。你不必找出所有這些依賴然后把它們寫在你的pom.xml里,你只需要加上你直接依賴的那些庫,Maven會隱式的把這些庫間接依賴的庫也加入到你的項目
中。Maven也會處理這些依賴中的沖突,同時能讓你自定義默認行為,或者排除一些特定的傳遞性依賴
Maven也提供了不同的依賴范圍(dependency scope),比如我們上個項目配置的JUNIT
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
其中的scope為test就是說明只有在運行測試編譯的時候才會加入到classpath中
注:
當為項目創建JAR文件的時候,它的依賴不會被捆綁在生成的構件中,他們只是用來編
譯。當用Maven來創建WAR或者EAR,你可以配置Maven讓它在生成的構件中捆綁依賴,
你也可以配置Maven,使用provided范圍,讓它排除WAR文件中特定的依賴。provided范
圍告訴Maven一個依賴在編譯的時候需要,但是它不應該被捆綁在構建的輸出中。當你
開發web應用的時候provided范圍變得十分有用,你需要通過Servlet API來編譯你的代
碼,但是你不希望Servlet API的JAR文件包含在你web應用的WEB-INF/lib目錄中。
浙公網安備 33010602011771號