一、Maven簡介:
Maven是一個項目管理構建的工具,它涵蓋項目的構建、依賴、測試、打包、部署、發布等等一系列的功能。並且Maven也成為了一個項目結構的標准。
因此現有的絕大部分IDE都將支持Maven項目。
二、安裝:
1. 到Apache官網下載最新版本
2. 解壓縮,並配置Maven的環境變量
3. 在Maven的核心配置文件settings.xml中配置本地倉庫
<localRepository>D:/m2</localRepository>
三、倉庫:
Maven倉庫用於存放項目的jar文件以及Maven的插件,在開發的過程中所需要用的jar包,都可以從倉庫中查找並依賴到當前項目中。
倉庫分本地倉庫和遠程倉庫
本地倉庫顧名思義就是存在本機中的,maven在查找依賴的jar的時候先會從本地倉庫查找,如果本地倉庫沒有則會訪問遠程倉庫查找並下載到本地倉庫中(Apache有一個龐大的遠程倉庫開發給所有開發人員使用。當然也有很多第三方的遠程倉庫)。當下一次再依賴相同的jar的時候,就可以從本地倉庫找到,無需再訪問遠程倉庫下載,節省網絡帶寬。
四、坐標(GAV):
Maven在倉庫中要找到具體的jar文件是通過坐標來查找的。
G代表的是組織,表示當前依賴的jar是隸屬於哪個組織
A代表項目名,也就是jar的名稱
V代表版本號,因為一個項目的jar是有多個版本,具體要依賴哪個版本
根據GAV坐標就能確定找到具體jar並依賴到當前項目中
在pom.xml文件中可以看到如下的配置:
<groupId>edu.hibenratedemo</groupId>
<artifactId>ch07</artifactId>
<version>1.0-SNAPSHOT</version>
五、pom.xml文件
pom的全稱叫Project Object Module(項目對象模型)。每一個maven項目都有一個pom.xml文件,它是maven項目的核心配置。這個配置文件主要用於項目的坐標、依賴管理、項目屬性、插件以及遠程倉庫的配置。
1.pom文件的依賴配置:
dependencies是依賴jar文件配置的根節點,根節點中可以配置多個dependencie依賴
每個dependencie依賴中指定的都是依賴的坐標,也就是我們所說的GAV。
例如:
<dependencies>
<!-- 添加hibernate依賴 -->
<dependency>
<!-- 組織名稱 -->
<groupId>org.hibernate</groupId>
<!-- 項目名稱-->
<artifactId>hibernate-core</artifactId>
<!-- 版本號-->
<version>5.2.11.Final</version>
</dependency>
<!-- 添加c3p0連接池依賴 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.11.Final</version>
</dependency>
</dependencies>
2.關於<dependency>節點中的<scope>作用:
compile:
默認就是compile,什么都不配置也就是意味着compile。compile表示被依賴項目需要參與當前項目的編譯,當然后續的測試,運行周期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。
test
scope為test表示依賴項目僅僅參與測試相關的工作,包括測試代碼的編譯,執行。比較典型的如junit。
runntime
runntime表示被依賴項目無需參與項目的編譯,不過后期的測試和運行周期需要其參與。與compile相比,跳過編譯而已,說實話在終端的項目(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,具體實現是runtime的,compile只需要知道接口就足夠了。oracle jdbc驅動架包就是一個很好的例子,一般scope為runntime。另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實現,也可以用B實現。
provided
provided意味着打包的時候可以不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上可以參與編譯,測試,運行等周期。相當於compile,但是在打包階段做了exclude的動作。
4.傳遞依賴
A->B->C->D
A如果依賴了B,而B又依賴了C和D,那么A就簡介依賴了C和D,這就是傳遞依賴性。
依賴原則:
有時候通過maven的傳遞依賴也會導致重復依賴的現象。一旦發生這種情況,maven會根據
以下的原則順序進行依賴
1. maven會優先依據最短路徑原則來選擇
2. 根據pom的配置的依賴順序來選擇
還可以通過排除的方式排除相同的依賴,在<exclusions>標簽中配置即可
例如:
<dependency>
<groupId>org.evergreen</groupId>
<artifactId>evergreen-mvc</artifactId>
<version>1.2.1.RELEASE</version>
<!-- 排除依賴 -->
<exclusions>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
5.pom文件的屬性配置:
properties節點用於配置maven項目的一些屬性,比如項目的編碼以及依賴jar的版本號統一設置。例如:
<properties>
<!-- 設置整個maven項目的編碼格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 配置控制台輸出的編碼格式,解決maven在控制台輸出亂碼 -->
<argLine>-Dfile.encoding=UTF-8</argLine>
<!-- 統一設置依賴jar的版本號,標簽名可以自定義
通常都以"項目名.version""的方式命名-->
<hibernate.version>5.2.11.Final</hibernate.version>
<junit.version>4.12</junit.version>
<mysql.version>5.1.38</mysql.version>
</properties>
3.pom文件的插件配置:
maven本身的所有功能都是以插件的方式提供的。比如maven的依賴、編譯、測試、打包、部署這些功能,都是有不同的插件模塊完成,這些插件就構成了maven強大的功能。
我們也可以在pom文件中對這些插件進行相關的細節配置,例如配置編譯插件的版本號,部署插件的部署設置等等。
例如:配置編譯插件
<build>
<plugins>
<!-- 編譯插件,指定JDK的編譯版本為1.8 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
六、Maven生命周期與插件:
Maven之所以強大,是因為它有一個十分完善的生命周期模型(lifecycle)。它擁有三套相互獨立的生命周期,而每套生命周期都由一組階段(Phase)組成。我們可以執行某個生命周期的某個階段,也可以組合執行不同生命周期的不同階段。(注意:執行了某個階段,那么這個階段之前的所有階段都會執行),每個階段的處理都由相應的插件來完成。
1. Clean 周期
說明:在進行真正的構建之前進行一些清理工作。
階段:
pre-clean 執行一些需要在clean之前完成的工作
clean 移除所有上一次構建生成的文件
post-clean 執行一些需要在clean之后立刻完成的工作
2. Default 周期
說明:構建的核心部分,編譯,測試,打包,部署等等。
階段:
validate 驗證項目是否正確且所有必要的信息都可用。
initialize 初始化構建工作,如:設置參數,創建目錄等。
generate-sources 為包含在編譯范圍內的代碼生成源代碼。
process-sources 處理源代碼。
generate-resources 生成資源文件。
process-resources 復制並處理資源文件,至目標目錄,准備打包。
compile 編譯項目的源代碼。
process-classes 為編譯生成的class文件做后期工作, 例如做Java類的字節碼增強。
generate-test-sources 為編譯內容生成測試源代碼。
process-test-sources 處理測試源代碼。
generate-test-resources 生成測試所需的資源文件。
process-test-resources 復制並處理資源文件,至目標測試目錄。
test-compile 編譯測試源代碼。
process-test-classes 為編譯生成測試的class文件做后期處理工作。
test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
prepare-package 執行打包前的預處理工作。
package 接受編譯好的代碼,打包成可發布的格式,如 JAR 、war。
pre-integration-test 預集成測試。
integration-test 按需求將發布包部署到運行測試環境。
post-integration-test 執行整合測試。
verify 執行后期校驗。
install 將包安裝至本地倉庫,以讓其它項目依賴。
deploy 將最終的包復制到遠程的倉庫,以讓其它開發人員與項目共享。
3. Site 周期
說明:生成項目報告,站點,發布站點。
階段:
pre-site 執行一些需要在生成站點文檔之前完成的工作。
site 生成項目的站點文檔。
post-site 執行一些需要在生成站點文檔之后完成的工作,並且為部署做准備。
site-deploy 將生成的站點文檔部署到特定的服務器上。
七、繼承與聚合
Maven也是類似面向對象的一種基礎概念,它主要體現在父項目和子項目之間的繼承和聚合關系。
1.繼承主要解決子類重復的依賴、以及相關重復配置信息,可以把所有共同的配置都放在父項目中。
2.聚合主要是通過在父項目中的包含所有的子模塊,這樣方便我們對所有子項目的統一構建