1. 程式人生 > >Maven系列—Maven概述

Maven系列—Maven概述

一,概述 1. 什麼是Maven? Maven 是標準、儲存格式以及一些軟體用以管理和描述專案。它為構建、測試、部署專案定義了一個標準的生命週期。它提供了一個框架,允許遵循 Maven 標準的所有專案,方便的重用的構建邏輯。Maven 專案存在的 Apache 軟體基金會,是一個開源社群,它開發的軟體工具,基於一個通用的軟體物件模型(Project Object Model),也就是POM。 2. Maven能為我們做什麼?
  1. 構建專案(Builds)
  2. 文件編制(Documentation)
  3. 報告(Reporting)
  4. 依賴管理(Dependencies)
  5. 配置管理(SCMs)
  6. 釋出管理(Releases)
3. Maven最核心的理念是什麼? 約定優於配置。 4. Maven強大的依賴管理 Maven的依賴是使用座標來定位的,而Maven座標主要由GAV(groupId, artifactId, version)構成。因此,使用任何一個依賴之間,你都需要知道它的Maven座標。 例如:

上例中我們聲明瞭一個對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. 三套相互獨立的生命週期
  1. Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
  2. Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
  3. Site Lifecycle 生成專案報告,站點,釋出站點。
2. Default 生命週期階段描述
  1. validate 驗證專案是否正確,以及所有為了完整構建必要的資訊是否可用
  2. compile 編譯專案的原始碼
  3. test 使用合適的單元測試框架執行測試。這些測試應該不需要程式碼被打包或釋出
  4. package 將編譯好的程式碼打包成可分發的格式,如JAR,WAR,或者EAR
  5. integration-test 如果有必要的話,處理包併發布至整合測試可以執行的環境
  6. verify 執行所有檢查,驗證包是有效的,符合質量規範
  7. install 安裝包至本地倉庫,以備本地的其它專案作為依賴使用
  8. deploy 複製最終的包至遠端倉庫,共享給其它開發人員和專案(通常和一次正式的釋出相關)
3. pom.xml詳解 <project > :檔案的根節點 .
<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) 測試覆蓋率外掛