Maven系列—Maven概述
- 構建專案(Builds)
- 文件編制(Documentation)
- 報告(Reporting)
- 依賴管理(Dependencies)
- 配置管理(SCMs)
- 釋出管理(Releases)
上例中我們聲明瞭一個對junit的依賴,它的groupId是junit, artifactId是junit, version是4.8。這一組GAV構成了一個Maven座標,基於此,Maven就能在本地或者遠端倉庫中找到對應的junit-4.8.jar檔案
5. Maven如何控制依賴包的版本?
來一個例子:
<dependencies>
<dependency>
<groupId>org.spring.framework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.spring.framework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.spring.framework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.spring.framework</groupId>
<artifactId>spring-mock</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<properties>
<spring.version>2.5</spring.version>
</properties>
當需要升級spring的時候,只要更改一個地方便可,而且,你現在能很高的保證所有的spring依賴包都是同一個版本。
6. 依賴範圍(scope)
再來幾個例子:
1)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>test</scope>
</dependency>
將依賴範圍設定成test,junit對於主原始碼classpath不可用,對於測試原始碼classpath可用,不會被打包。
2)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
將依賴範圍設定成provided,就意味著該依賴對於主原始碼classpath,以及測試classpath可用,但不會被打包。這正是servlet-api所需要的。
總結一下各個依賴範圍:
compile
預設的scope,表示 dependency 都可以在生命週期中使用。而且,這些dependencies 會傳遞到依賴的專案中。
provided
跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能作用在編譯和測試時,同時沒有傳遞性。
runtime
表示dependency不作用在編譯時,但會作用在執行和測試時
test
表示dependency作用在測試時,不作用在執行時。
system
跟provided 相似,但是在系統中要以外部JAR包的形式提供,maven不會在repository查詢它。例如:
import(Maven 2.0.9 之後新增)
它只使用在<dependencyManagement>中,表示從其它的pom中匯入dependency的配置。
二,Maven的構建生命週期
國際慣例先概述下:
Maven強大的一個重要的原因是它有一個十分完善的生命週期模型(lifecycle),這個生命週期可以從兩方面來理解,第一,顧名思義,執行Maven的每個步驟都由它來定義的,這種預定義的預設行為使得我們使用Maven變得簡單,相比而言,Ant的每個步驟都要你手工去定義。第二,這個模型是一種標準,在不同的專案中,使用Maven的介面是一樣的,這樣就不用去仔細理解每個專案的構建了,一般情況下,mvn clean install這樣的命令是通用的。 1. 三套相互獨立的生命週期2. Default 生命週期階段描述
- Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
- Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
- Site Lifecycle 生成專案報告,站點,釋出站點。
3. pom.xml詳解 <project > :檔案的根節點 .
- validate 驗證專案是否正確,以及所有為了完整構建必要的資訊是否可用
- compile 編譯專案的原始碼
- test 使用合適的單元測試框架執行測試。這些測試應該不需要程式碼被打包或釋出
- package 將編譯好的程式碼打包成可分發的格式,如JAR,WAR,或者EAR
- integration-test 如果有必要的話,處理包併發布至整合測試可以執行的環境
- verify 執行所有檢查,驗證包是有效的,符合質量規範
- install 安裝包至本地倉庫,以備本地的其它專案作為依賴使用
- deploy 複製最終的包至遠端倉庫,共享給其它開發人員和專案(通常和一次正式的釋出相關)
<modelversion > : pom.xml使用的物件模型版本 .
<groupId > :建立專案的組織或團體的唯一 Id.
<artifactId > :專案的唯一 Id, 可視為專案名 .
<packaging > :打包型別,一般有JAR,WAR,EAR 等
<version > :產品的版本號 .
<name > :專案的顯示名,常用於 Maven 生成的文件。
<url > :組織的站點,常用於 Maven 生成的文件。
<description > :專案描述,常用於 Maven 生成的文件。 <dependencies>:構件依賴 <parent>:模型繼承 <dependencyManagement>:依賴管理 <reporting>:建立報告 <build>:構建 <repositories>:引用第三方倉庫 <licenses>:許可 4. Maven的外掛 1) 編譯外掛
2) 測試報告外掛
3) 測試覆蓋率外掛