Maven簡(jiǎn)介
Maven是一個(gè)強(qiáng)大的Java項(xiàng)目構(gòu)建工具。由于Maven是用Java開發(fā)的,因此Maven被更多的用于Java項(xiàng)目中。
構(gòu)建工具是將軟件項(xiàng)目構(gòu)建相關(guān)的過(guò)程自動(dòng)化的工具。構(gòu)建一個(gè)軟件項(xiàng)目通常包含以下一個(gè)或多個(gè)過(guò)程:
生成源碼(如果項(xiàng)目使用自動(dòng)生成源碼);
從源碼生成項(xiàng)目文檔;
編譯源碼;
將編譯后的代碼打包成JAR文件或者ZIP文件;
將打包好的代碼安裝到服務(wù)器、倉(cāng)庫(kù)或者其它的地方;
Maven 使用約定而不是配置,意味著開發(fā)者不需要再自己創(chuàng)建構(gòu)建過(guò)程。
開發(fā)者不需要再關(guān)心每一個(gè)配置細(xì)節(jié)。Maven 為工程提供了合理的默認(rèn)行為。當(dāng)創(chuàng)建 Maven 工程時(shí),Maven 會(huì)創(chuàng)建默認(rèn)的工程結(jié)構(gòu)。開發(fā)者只需要合理的放置文件,而在 pom.xml 中不再需要定義任何配置。項(xiàng)目對(duì)象模型(POM): POM 是 Maven 2 中的里程碑式的模型。該模型的一部分已經(jīng)構(gòu)建到 Maven 引擎(被親切地稱為反應(yīng)堆 )中,其余部分則通過(guò)一個(gè)名叫 pom.xml 的基于 XML 的元數(shù)據(jù)文件來(lái)聲明。
依賴項(xiàng)管理模型: Maven 對(duì)如何管理項(xiàng)目的依賴項(xiàng)很在行。依賴項(xiàng)管理是一片灰色地帶,典型的構(gòu)建-管理工具和系統(tǒng)都未明確涉及。Maven 2 構(gòu)建了 Maven 依賴項(xiàng)管理模型,該模型能夠適應(yīng)大多數(shù)需求。這個(gè)模型被證明是有效而高產(chǎn)的模型,目前,主要的開源項(xiàng)目都部署了該模型。
-
構(gòu)建生命周期和階段:和 POM 相關(guān)的概念是構(gòu)建生命周期 和階段。這是 Maven 2 的內(nèi)嵌概念模型和現(xiàn)實(shí)物理世界之間的接口。使用 Maven 時(shí),工作主要是通過(guò)插件來(lái)執(zhí)行的。在構(gòu)建周期中,Maven 2 通過(guò)遵循一系列定義好的階段,將這些插件協(xié)調(diào)起來(lái)。
下面的表格展示了工程源碼文件、資源文件的默認(rèn)配置,和其他一些配置。假定 ${basedir} 表示工程目錄:| 配置項(xiàng) | 默認(rèn)值 |
| ------------- |:-------------:|
| resources | ${basedir}/src/main/resources |
| Tests | ${basedir}/src/test |
| Complied byte code | ${basedir}/target |
| distributable JAR | ${basedir}/target/classes |
為了構(gòu)建工程,Maven 為開發(fā)者提供了選項(xiàng)來(lái)配置生命周期目標(biāo)和工程依賴(依賴于 Maven 的插件擴(kuò)展功能和默認(rèn)的約定)。大部分的工程管理和構(gòu)建相關(guān)的任務(wù)是由 Maven 插件完成的。
開發(fā)人員不需要了解每個(gè)插件是如何工作的,就能夠構(gòu)建任何給定的 Maven 工程。
Maven - 環(huán)境配置
Maven 是一個(gè)基于 Java 的工具,所以要做的第一件事情就是安裝 JDK。
系統(tǒng)要求
| 項(xiàng)目 | 要求 |
|---|---|
| JDK | Maven 3.3 要求 JDK 1.7 或以上 Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上 |
| 內(nèi)存 | 沒(méi)有最低要求 |
| 磁盤 | Maven 自身安裝需要大約 10 MB 空間。 除此之外,額外的磁盤空間將用于你的本地 Maven 倉(cāng)庫(kù)。 你本地倉(cāng)庫(kù)的大小取決于使用情況,但預(yù)期至少 500 MB。 |
| 操作系統(tǒng) | 沒(méi)有最低要求 |
步驟 1:檢查 Java 安裝
| 操作系統(tǒng) | 任務(wù) | 命令 |
|---|---|---|
| Windows | 打開命令控制臺(tái) | c:> java -version |
| Linux | 打開命令終端 | $ java -version |
| Mac | 打開終端 | machine:~ joseph$ java -version |
現(xiàn)在打開控制臺(tái),執(zhí)行下面的 java 命令。
| 操作系統(tǒng) | 任務(wù) | 命令 |
|---|---|---|
| Windows | 打開命令控制臺(tái) | c:> java -version |
| Linux | 打開命令終端 | $ java -version |
| Mac | 打開終端 | machine:~ joseph$ java -version |
| 操作系統(tǒng) | 輸出 |
|---|---|
| Windows | java version "1.6.0_21" Java(TM) SE Runtime Environment (build 1.6.0_21-b07) Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) |
| Linux | java version "1.6.0_21" Java(TM) SE Runtime Environment (build 1.6.0_21-b07) Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) |
| Mac | java version "1.6.0_21" Java(TM) SE Runtime Environment (build 1.6.0_21-b07) Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) |
步驟 2:設(shè)置 Java 環(huán)境
步驟 3:下載 Maven 文件
從以下網(wǎng)址下載 Maven 3.2.5:http://maven.apache.org/download.html
步驟 4:解壓 Maven 文件
| 操作系統(tǒng) | 位置 (根據(jù)你的安裝位置而定) |
|---|---|
| Windows | C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 |
| Linux | /usr/local/apache-maven |
| Mac | /usr/local/apache-maven |
解壓文件到你想要的位置來(lái)安裝 Maven 3.2.5,你會(huì)得到 apache-maven-3.2.5 子目錄。
| 操作系統(tǒng) | 位置 (根據(jù)你的安裝位置而定) |
|---|---|
| Windows | C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 |
| Linux | /usr/local/apache-maven |
| Mac | /usr/local/apache-maven |
步驟 5:設(shè)置 Maven 環(huán)境變量
| 操作系統(tǒng) | 輸出 |
|---|---|
| Windows | 使用系統(tǒng)屬性設(shè)置環(huán)境變量。 M2_HOME=C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 M2=%M2_HOME%\bin MAVEN_OPTS=-Xms256m -Xmx512m |
| Linux | 打開命令終端設(shè)置環(huán)境變量。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
| Mac | 打開命令終端設(shè)置環(huán)境變量。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
添加 M2_HOME、M2、MAVEN_OPTS 到環(huán)境變量中。
| 操作系統(tǒng) | 輸出 |
|---|---|
| Windows | 使用系統(tǒng)屬性設(shè)置環(huán)境變量。 M2_HOME=C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 M2=%M2_HOME%\bin MAVEN_OPTS=-Xms256m -Xmx512m |
| Linux | 打開命令終端設(shè)置環(huán)境變量。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
| Mac | 打開命令終端設(shè)置環(huán)境變量。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
步驟 6:添加 Maven bin 目錄到系統(tǒng)路徑中
| 操作系統(tǒng) | 輸出 |
|---|---|
| Windows | 添加字符串 “;%M2%” 到系統(tǒng)“Path”變量末尾 |
| Linux | export PATH=M2:PATH |
| Mac | export PATH=M2:PATH |
步驟 7:驗(yàn)證 Maven 安裝
| 操作系統(tǒng) | 輸出 | 命令 |
|---|---|---|
| Windows | 打開命令控制臺(tái) | c:> mvn --version |
| Linux | 打開命令終端 | $ mvn --version |
| Mac | 打開終端 | machine:~ joseph$ mvn --version |
現(xiàn)在打開控制臺(tái),執(zhí)行以下 mvn 命令。
| 操作系統(tǒng) | 輸出 | 命令 |
|---|---|---|
| Windows | 打開命令控制臺(tái) | c:> mvn --version |
| Linux | 打開命令終端 | $ mvn --version |
| Mac | 打開終端 | machine:~ joseph$ mvn --version |
Maven - POM
Maven的中心思想是POM文件(項(xiàng)目對(duì)象模型)。POM文件是以XML文件的形式表述項(xiàng)目的資源,如源碼、測(cè)試代碼、依賴(用到的外部Jar包)等。POM文件應(yīng)該位于項(xiàng)目的根目錄下。POM 包含了關(guān)于工程和各種配置細(xì)節(jié)的信息,Maven 使用這些信息構(gòu)建工程。
POM文件描述的是構(gòu)建“什么”,而不是“如何”構(gòu)建。如何構(gòu)建是取決于Maven的構(gòu)建階段和目標(biāo)。
每一個(gè)項(xiàng)目都有一個(gè)POM文件。POM文件即pom.xml,應(yīng)該放在項(xiàng)目的根目錄下。一個(gè)項(xiàng)目如果分為多個(gè)子項(xiàng)目,一般來(lái)講,父項(xiàng)目有一個(gè)POM文件,每一個(gè)子項(xiàng)目都有一個(gè)POM文件。在這種結(jié)構(gòu)下,既可以一步構(gòu)建整個(gè)項(xiàng)目,也可以各個(gè)子項(xiàng)目分開構(gòu)建。
下圖說(shuō)明了Maven是如何使用POM文件的,以及POM文件的主要組成部分:

POM 也包含了目標(biāo)和插件。當(dāng)執(zhí)行一個(gè)任務(wù)或者目標(biāo)時(shí),Maven 會(huì)查找當(dāng)前目錄下的 POM,從其中讀取所需要的配置信息,然后執(zhí)行目標(biāo)。能夠在 POM 中設(shè)置的一些配置如下:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
在創(chuàng)建 POM 之前,我們首先確定工程組(groupId),及其名稱(artifactId)和版本,在倉(cāng)庫(kù)中這些屬性是工程的唯一標(biāo)識(shí)。
POM 舉例
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
</project>
需要說(shuō)明的是每個(gè)工程應(yīng)該只有一個(gè) POM 文件。
- 所有的 POM 文件需要 project 元素和三個(gè)必須的字段:groupId, artifactId,version。
- 在倉(cāng)庫(kù)中的工程標(biāo)識(shí)為 groupId:artifactId:version
- POM.xml 的根元素是 project,它有三個(gè)主要的子節(jié)點(diǎn):
| 節(jié)點(diǎn) | 描述 |
|---|---|
| groupId | 這是工程組的標(biāo)識(shí)。它在一個(gè)組織或者項(xiàng)目中通常是唯一的。例如,一個(gè)銀行組織 com.company.bank 擁有所有的和銀行相關(guān)的項(xiàng)目。 |
| artifactId | 這是工程的標(biāo)識(shí)。它通常是工程的名稱。例如,消費(fèi)者銀行。groupId 和 artifactId 一起定義了 artifact 在倉(cāng)庫(kù)中的位置。 |
| version | 這是工程的版本號(hào)。在 artifact 的倉(cāng)庫(kù)中,它用來(lái)區(qū)分不同的版本。例如:com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1. |
Super POM
所有的Maven pom文件都繼承自一個(gè)父pom。如果沒(méi)有指定父pom,則該pom文件繼承自根pom。pom文件的繼承關(guān)系如下圖所示:

可以讓一個(gè)pom文件顯式地繼承另一個(gè)pom文件。這樣,可以通過(guò)修改公共父pom文件的設(shè)置來(lái)修改所有子pom文件的設(shè)置。在pom文件的起始處指定父pom,例如:
<project xmlns=”http://maven.apache.org/POM/4.0.0″
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd”>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
…
</project>