作者:孤傲蒼狼
在平面幾何中坐标(x,y)可以辨別平面中唯一的一點。
groupId:組織辨別(包名)
artifactId:項目名稱
version:項目的目前版本
packaging:項目的打包方式,最為常見的jar和war兩種
樣例:
Maven世界擁有大量建構,我們需要找一個用來唯一辨別一個建構的統一規範。
擁有了統一規範,就可以把查找工作交給機器。
依賴配置主要包含如下元素:
<code><!--添加依賴配置--></code>
<code><dependencies></code>
<code><!--項目要使用到junit的jar包,是以在這裡添加junit的jar包的依賴--></code>
<code><dependency></code>
<code><groupId>junit</groupId></code>
<code><artifactId>junit</artifactId></code>
<code><version>4.9</version></code>
<code><scope>test</scope></code>
<code></dependency></code>
<code><!--項目要使用到Hello的jar包,是以在這裡添加Hello的jar包的依賴--></code>
<code><groupId>me.gacl.maven</groupId></code>
<code><artifactId>Hello</artifactId></code>
<code><version>0.0.1-SNAPSHOT</version></code>
<code><scope>compile</scope></code>
<code></dependencies></code>
依賴範圍scope用來控制依賴和編譯,測試,運作的classpath的關系. 主要的是三種依賴關系如下:1.compile:預設編譯依賴範圍。對于編譯,測試,運作三種classpath都有效 2.test:測試依賴範圍。隻對于測試classpath有效 3.provided:已提供依賴範圍。對于編譯,測試的classpath都有效,但對于運作無效。因為由容器已經提供,例如servlet-api 4.runtime:運作時提供。例如:jdbc驅動
MakeFriends.jar直接依賴于HelloFriends.jar,而HelloFriends.jar又直接依賴于Hello.jar,那麼MakeFriends.jar也依賴于Hello.jar,這就是傳遞性依賴,隻不過這種依賴是間接依賴,如下圖所示:
用來統一存儲所有Maven共享建構的位置就是倉庫
根據Maven坐标定義每個建構在倉庫中唯一存儲路徑,大緻為:groupId/artifactId/version/artifactId-version.packaging
每個使用者隻有一個本地倉庫,預設是在~/.m2/repository/,~代表的是使用者目錄
1、中央倉庫:Maven預設的遠端倉庫,URL位址:http://search.maven.org/
2、私服:是一種特殊的遠端倉庫,它是架設在區域網路内的倉庫
Maven生命周期就是為了對所有的建構過程進行抽象和統一,包括項目清理,初始化,編譯,打包,測試,部署等幾乎所有建構步驟
Maven有三套互相獨立的生命周期,請注意這裡說的是"三套",而且"互相獨立",這三套生命周期分别是:
Clean Lifecycle 在進行真正的建構之前進行一些清理工作。
Default Lifecycle 建構的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle 生成項目報告,站點,釋出站點。
再次強調一下它們是互相獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用site來生成站點。當然你也可以直接運作 mvn clean install site 運作所有這三套生命周期。clean生命周期每套生命周期都由一組階段(Phase)組成,我們平時在指令行輸入的指令總會對應于一個特定的階段。比如,運作mvn clean ,這個的clean是Clean生命周期的一個階段。有Clean生命周期,也有clean階段。Clean生命周期一共包含了三個階段:
pre-clean 執行一些需要在clean之前完成的工作
clean 移除所有上一次建構生成的檔案
post-clean 執行一些需要在clean之後立刻完成的工作
"mvn clean" 中的clean就是上面的clean,在一個生命周期中,運作某個階段的時候,它之前的所有階段都會被運作,也就是說,"mvn clean"等同于 mvn pre-clean clean ,如果我們運作 mvn post-clean ,那麼 pre-clean,clean 都會被運作。這是Maven很重要的一個規則,可以大大簡化指令行的輸入。Site生命周期pre-site 執行一些需要在生成站點文檔之前完成的工作
site 生成項目的站點文檔
post-site 執行一些需要在生成站點文檔之後完成的工作,并且為部署做準備
site-deploy 将生成的站點文檔部署到特定的伺服器上
這裡經常用到的是site階段和site-deploy階段,用以生成和釋出Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計資料自動生成,很好看。Default生命周期Default生命周期是Maven生命周期中最重要的一個,絕大部分工作都發生在這個生命周期中。這裡,隻解釋一些比較重要和常用的階段:
validate
generate-sources
process-sources
generate-resources
process-resources 複制并處理資源檔案,至目标目錄,準備打包。
compile 編譯項目的源代碼。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 複制并處理資源檔案,至目标測試目錄。
test-compile 編譯測試源代碼。
process-test-classes
test 使用合适的單元測試架構運作測試。這些測試代碼不會被打包或部署。
prepare-package
package 接受編譯好的代碼,打包成可釋出的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安裝至本地倉庫,以讓其它項目依賴。
deploy 将最終的包複制到遠端的倉庫,以讓其它開發人員與項目共享。
運作任何一個階段的時候,它前面的所有階段都會被運作,這也就是為什麼我們運作mvn install 的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是完全依賴Maven的生命周期的,是以了解生命周期至關重要。
Maven的核心僅僅定義了抽象的生命周期,具體的任務都是交由插件完成的。
每個插件都能實作多個功能,每個功能就是一個插件目标。
Maven的生命周期與插件目标互相綁定,以完成某個具體的建構任務,例如compile就是插件maven-compiler-plugin的一個插件目标。
END