Maven簡介
Maven是一個強大的Java項目構建工具。由于Maven是用Java開發的,因此Maven被更多的用于Java項目中。
構建工具是將軟件項目構建相關的過程自動化的工具。構建一個軟件項目通常包含以下一個或多個過程:
生成源碼(如果項目使用自動生成源碼);
從源碼生成項目文檔;
編譯源碼;
將編譯后的代碼打包成JAR文件或者ZIP文件;
將打包好的代碼安裝到服務器、倉庫或者其它的地方;
Maven 使用約定而不是配置,意味著開發者不需要再自己創建構建過程。
開發者不需要再關心每一個配置細節。Maven 為工程提供了合理的默認行為。當創建 Maven 工程時,Maven 會創建默認的工程結構。開發者只需要合理的放置文件,而在 pom.xml 中不再需要定義任何配置。項目對象模型(POM): POM 是 Maven 2 中的里程碑式的模型。該模型的一部分已經構建到 Maven 引擎(被親切地稱為反應堆 )中,其余部分則通過一個名叫 pom.xml 的基于 XML 的元數據文件來聲明。
依賴項管理模型: Maven 對如何管理項目的依賴項很在行。依賴項管理是一片灰色地帶,典型的構建-管理工具和系統都未明確涉及。Maven 2 構建了 Maven 依賴項管理模型,該模型能夠適應大多數需求。這個模型被證明是有效而高產的模型,目前,主要的開源項目都部署了該模型。
-
構建生命周期和階段:和 POM 相關的概念是構建生命周期 和階段。這是 Maven 2 的內嵌概念模型和現實物理世界之間的接口。使用 Maven 時,工作主要是通過插件來執行的。在構建周期中,Maven 2 通過遵循一系列定義好的階段,將這些插件協調起來。
下面的表格展示了工程源碼文件、資源文件的默認配置,和其他一些配置。假定 ${basedir} 表示工程目錄:| 配置項 | 默認值 |
| ------------- |:-------------:|
| resources | ${basedir}/src/main/resources |
| Tests | ${basedir}/src/test |
| Complied byte code | ${basedir}/target |
| distributable JAR | ${basedir}/target/classes |
為了構建工程,Maven 為開發者提供了選項來配置生命周期目標和工程依賴(依賴于 Maven 的插件擴展功能和默認的約定)。大部分的工程管理和構建相關的任務是由 Maven 插件完成的。
開發人員不需要了解每個插件是如何工作的,就能夠構建任何給定的 Maven 工程。
Maven - 環境配置
Maven 是一個基于 Java 的工具,所以要做的第一件事情就是安裝 JDK。
系統要求
項目 | 要求 |
---|---|
JDK | Maven 3.3 要求 JDK 1.7 或以上 Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上 |
內存 | 沒有最低要求 |
磁盤 | Maven 自身安裝需要大約 10 MB 空間。 除此之外,額外的磁盤空間將用于你的本地 Maven 倉庫。 你本地倉庫的大小取決于使用情況,但預期至少 500 MB。 |
操作系統 | 沒有最低要求 |
步驟 1:檢查 Java 安裝
操作系統 | 任務 | 命令 |
---|---|---|
Windows | 打開命令控制臺 | c:> java -version |
Linux | 打開命令終端 | $ java -version |
Mac | 打開終端 | machine:~ joseph$ java -version |
現在打開控制臺,執行下面的 java 命令。
操作系統 | 任務 | 命令 |
---|---|---|
Windows | 打開命令控制臺 | c:> java -version |
Linux | 打開命令終端 | $ java -version |
Mac | 打開終端 | machine:~ joseph$ java -version |
操作系統 | 輸出 |
---|---|
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:設置 Java 環境
步驟 3:下載 Maven 文件
從以下網址下載 Maven 3.2.5:http://maven.apache.org/download.html
步驟 4:解壓 Maven 文件
操作系統 | 位置 (根據你的安裝位置而定) |
---|---|
Windows | C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 |
Linux | /usr/local/apache-maven |
Mac | /usr/local/apache-maven |
解壓文件到你想要的位置來安裝 Maven 3.2.5,你會得到 apache-maven-3.2.5 子目錄。
操作系統 | 位置 (根據你的安裝位置而定) |
---|---|
Windows | C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 |
Linux | /usr/local/apache-maven |
Mac | /usr/local/apache-maven |
步驟 5:設置 Maven 環境變量
操作系統 | 輸出 |
---|---|
Windows | 使用系統屬性設置環境變量。 M2_HOME=C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 M2=%M2_HOME%\bin MAVEN_OPTS=-Xms256m -Xmx512m |
Linux | 打開命令終端設置環境變量。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
Mac | 打開命令終端設置環境變量。 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 到環境變量中。
操作系統 | 輸出 |
---|---|
Windows | 使用系統屬性設置環境變量。 M2_HOME=C:\Program Files\Apache Software Foundation\apache-maven-3.2.5 M2=%M2_HOME%\bin MAVEN_OPTS=-Xms256m -Xmx512m |
Linux | 打開命令終端設置環境變量。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
Mac | 打開命令終端設置環境變量。 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 目錄到系統路徑中
操作系統 | 輸出 |
---|---|
Windows | 添加字符串 “;%M2%” 到系統“Path”變量末尾 |
Linux | export PATH=M2:PATH |
Mac | export PATH=M2:PATH |
步驟 7:驗證 Maven 安裝
操作系統 | 輸出 | 命令 |
---|---|---|
Windows | 打開命令控制臺 | c:> mvn --version |
Linux | 打開命令終端 | $ mvn --version |
Mac | 打開終端 | machine:~ joseph$ mvn --version |
現在打開控制臺,執行以下 mvn 命令。
操作系統 | 輸出 | 命令 |
---|---|---|
Windows | 打開命令控制臺 | c:> mvn --version |
Linux | 打開命令終端 | $ mvn --version |
Mac | 打開終端 | machine:~ joseph$ mvn --version |
Maven - POM
Maven的中心思想是POM文件(項目對象模型)。POM文件是以XML文件的形式表述項目的資源,如源碼、測試代碼、依賴(用到的外部Jar包)等。POM文件應該位于項目的根目錄下。POM 包含了關于工程和各種配置細節的信息,Maven 使用這些信息構建工程。
POM文件描述的是構建“什么”,而不是“如何”構建。如何構建是取決于Maven的構建階段和目標。
每一個項目都有一個POM文件。POM文件即pom.xml,應該放在項目的根目錄下。一個項目如果分為多個子項目,一般來講,父項目有一個POM文件,每一個子項目都有一個POM文件。在這種結構下,既可以一步構建整個項目,也可以各個子項目分開構建。
下圖說明了Maven是如何使用POM文件的,以及POM文件的主要組成部分:
POM 也包含了目標和插件。當執行一個任務或者目標時,Maven 會查找當前目錄下的 POM,從其中讀取所需要的配置信息,然后執行目標。能夠在 POM 中設置的一些配置如下:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
在創建 POM 之前,我們首先確定工程組(groupId),及其名稱(artifactId)和版本,在倉庫中這些屬性是工程的唯一標識。
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>
需要說明的是每個工程應該只有一個 POM 文件。
- 所有的 POM 文件需要 project 元素和三個必須的字段:groupId, artifactId,version。
- 在倉庫中的工程標識為 groupId:artifactId:version
- POM.xml 的根元素是 project,它有三個主要的子節點:
節點 | 描述 |
---|---|
groupId | 這是工程組的標識。它在一個組織或者項目中通常是唯一的。例如,一個銀行組織 com.company.bank 擁有所有的和銀行相關的項目。 |
artifactId | 這是工程的標識。它通常是工程的名稱。例如,消費者銀行。groupId 和 artifactId 一起定義了 artifact 在倉庫中的位置。 |
version | 這是工程的版本號。在 artifact 的倉庫中,它用來區分不同的版本。例如:com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1. |
Super POM
所有的Maven pom文件都繼承自一個父pom。如果沒有指定父pom,則該pom文件繼承自根pom。pom文件的繼承關系如下圖所示:
可以讓一個pom文件顯式地繼承另一個pom文件。這樣,可以通過修改公共父pom文件的設置來修改所有子pom文件的設置。在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>