在使用Maven的過程中,經常會遇到幾個核心的概念,准確的理解這些概念將會有莫大的幫助。
1. POM(Project Object Model)項目對象模型
POM 與 Java 代碼實現了解耦,當需要升級版本時,只需要修改POM,而不需要更改Java代碼,而在POM穩定后,日常的Java代碼開發基本不涉及POM的修改。
2. 坐標
groupId , artifactId , version 三個元素是項目的坐標,唯一的標識這個項目。
groupId 項目所在組,一般是組織或公司,artifactId 是當前項目在組中的唯一ID; version 表示版本,SNAPSHOT表示快照,表示此項目還在開發中,不穩定。
groupId 和實際項目不一定是一一對應的,maven 有模塊的概念,例如 spring-core, spring-context...;groupId 也不應該只對應公司或組織名,建議具體到項目名,因為公司或者組織下有多個項目,而artifactId只能代表模塊名。
3. 依賴
傳遞性依賴可能帶來一些問題,例如兩個依賴的版本不兼容,依賴SNAPSHOT可能會導致項目的不穩定問題,依賴的jar包由於版權問題無法使用等等問題,此時,就需要在dependency中用exclusion 排除依賴,然后引入合適的依賴,exclusion中只需提供groupId 和 artifactId 即可。
Maven解決依賴沖突的兩個原則:
1. 最短路徑(高優先級)
2. 最先聲明
幾個scope的有效范圍:
1. compile : 編譯,測試,運行都有效,默認的選擇
2. test : 測試有效,例如junit
3. provided : 編譯,測試有效,例如 servlet ,運行時容器會提供實現
4. runtime : 運行和測試有效,例如 jdbc,編譯時只需相應的接口,測試和運行時才需要具體的實現
5. system : 編譯,測試有效。使用此范圍的依賴必須通過systemPath元素顯式的指定依賴文件,因而
此類依賴是不通過Maven倉庫解析的,一般適合於本機測試環境下,依賴本地起的服務。
6. import(2.0.9 以上):
4. 聚合與繼承
聚合:僅僅是為了聚合其他模塊,這樣就不用每個模塊分別去執行MVN命令了,其本身並沒有實質性內容,注意其打包方式必須為pom
<moduls>
<modul> m1</modul>
<modul> m2</modul>
<modul> m3</modul>
</moduls>
繼承:
parent pom 用 <DependencyManagement> 聲明依賴以提高靈活性,其中聲明的依賴並不會實際引入實際的依賴,此時子pom繼承后的<dependency>就可以只寫groupId 和 artifactId ,其他細節 parent pom中已經聲明過了。
聚合是為了快速的構建項目,而繼承是為了避免重復配置。但兩者的打包方式都必須為pom
5. 快照
A 和 B 合作開發,B 開發的模塊依賴A開發的模塊,A 發布時version設為快照,例如 2.1-SNAPSHOT,再發布過程中,maven會自動給此版本打上時間戳,B 依賴於此快照版本,當B構建項目時,Maven會自動根據時間戳檢查最新版本,並更新。快照版本應該僅在組織內部的項目或者模塊間使用;正式發布時,要記得改為正式版本
6. 生命周期
三套獨立的生命周期(clean, default, site),每個周期都包含一些階段。
clean的三個階段:
1.pre-clean:執行一些清理前需要完成的工作
2.clean 清理上一次構建生成的文件
3. post-clean 執行一些清理后需要完成的工作
default的一些關鍵階段:
1. process-sources: 處理項目主資源文件,一般是將src/main/resources 目錄的內容進行變量替換等工作后,復制到項目輸出的主classpath目錄中。
2. compile 編譯項目的主源碼
3. process-test-sources: 處理項目測試資源文件
4. test-compile 編譯項目的測試代碼
5. test 進行測試
6. package 接受編譯好的代碼,打包成可發布的格式,例如jar
7. install 將包安裝到Maven本地倉庫,供本地其他Maven項目使用
8. deploy 將最終的包復制到遠程倉庫
site 生命周期
1. pre-site 2. site 3. post-site 4.site-deploy
相對應得幾個常用命令 mvn clean; mvn test; mvn clean compile; mvn clean install