Apache Maven是一個軟件項目管理和綜合工具。基于項目對象模型(POM)的概念,Maven可以從一個中心資料片管理項目構建,報告和文件。
您曾經是否會遇到這些問題:
1.我們要開發一個 Java 項目,為了保證編譯通過,我們會到處去尋找 jar 包。當編譯通過了,在運行的時候,卻發現 ClassNotFoundException,臥槽!還差 jar 包啊?再去找找吧。
2.每個 Java 項目的目錄結構都沒有一個統一的標準,配置文件到處都是,單元測試代碼到底應該放在哪里,沒有一個權威的規范。
3.可使用 Ant 做為項目構建工具,它可以自動化地完成編譯、測試、打包等任務,確實為我們省了不少事兒,但編寫 Ant 的 XML 腳本絕非是一件輕松的事情。
有了 Maven,以上這一切都不再是問題了。
看來Maven 要做的是兩件事情:1.統一開發規范與工具;
2.統一管理 jar 包。
一、使用前提
1.下載連接 http://maven.apache.org/download.cgi
2.配置環境變量
M2_HOME = maven根路徑
PATH = maven根路徑/bin
3.配置好之后,我們就可以執行maven命令了
mvn -v 顯示maven版本信息
二、了解 Maven 倉庫
使用 Maven 給我們帶來的最直接的幫助,就是 jar 包得到了統一管理,那么這些 jar 包存放在哪里呢?它們就在您的本地倉庫中,位于 C:\Users\用戶名.m2 目錄下(當然也可以修改這個默認地址)。
實際上可將本地倉庫理解“緩存”,因為項目首先會從本地倉庫中獲取 jar 包,當無法獲取指定 jar 包的時候,本地倉庫會從 遠程倉庫(或 中央倉庫)中下載 jar 包,并放入本地倉庫中以備將來使用。這個遠程倉庫是 Maven 官方提供的,可通過 http://search.maven.org/ 來訪問。這樣一來,本地倉庫會隨著項目的積累越來越大。通過下面這張圖可以清晰地表達項目、本地倉庫、遠程倉庫之間的關系。
maven查找依賴的順序
1.從本地倉庫中查找所需要的依賴
2.從私有倉庫中查找所需要的依賴
3.從中央倉庫(http://repo.maven.apache.org/)中查找所需要的依賴
三、理解 pom.xml
pom.xml 稱為 Project Object Model(項目對象模型),它用于描述整個 Maven 項目,所以也稱為 Maven 描述文件。
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.smart</groupId>
<artifactId>smart-demo</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>smart-demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>smart-demo</finalName>
</build></project>
從上往下簡要說明:
modelVersion:這個是 POM 的版本號,現在都是 4.0.0 的,必須得有,但不需要修改。
groupId、artifactId、version:分別表示 Maven 項目的組織名、構件名、版本號,它們三個合起來就是 Maven **坐標,根據這個坐標可以在 Maven 倉庫中對應唯一的 **Maven 構件。
packaging:表示該項目的打包方式,war 表示打包為 war 文件,默認為 jar,表示打包為 jar 文件。
name、url:表示該項目的名稱與 URL 地址,意義不大,可以省略。
dependencies:定義該項目的依賴關系,其中每一個 dependency 對應一個 Maven 項目,可見 Maven 坐標再次出現,還多了一個 scope,表示作用域(下面會描述)。
build:表示與構建相關的配置,這里的 finalName 表示最終構建后的名稱 smart-demo.war,這里的 finalName 還可以使用另一種方式來定義。
除了項目的基本信息(Maven 坐標、打包方式等)以外,每個 pom.xml 都應該包括:
Lifecycle(生命周期)
Plugins(插件)
Dependencies(依賴)
Lifecycle 是項目構建的生命周期,它包括 9 個 Phase(階段)。
大家知道,Maven 是一個核心加上多個插件的架構,而這些插件提供了一系列非常重要的功能,這些插件會在許多階段里發揮重要作用。
階段插件作用:
clean
clean 清理自動生成的文件,也就是 target 目錄
validate
由 Maven 核心負責 驗證 Maven 描述文件是否有效
compile
compile 編譯后產生target目錄,里面存放的就是編譯后的字節碼文件
test
compiler、surefire、resources 運行測試代碼
package
war 項目打包,就是生成構件包,也就是打 war 包
verify
由 Maven 核心負責,驗證構件包是否有效
install
install 將構件包安裝到本地倉庫
site
site 生成項目站點,就是一堆靜態網頁文件,包括 JavaDoc
deploy
deploy 將構件包部署到遠程倉庫
四、使用 Maven 命令
可使用兩種不同的方式來執行 Maven 命令:
方式一:mvn <插件>:<目標> [參數]
方式二:mvn <階段>
現在我們接觸到的都是第一種方式,而第二種方式才是我們日常中使用最頻繁的,例如:
mvn clean:清空輸出目錄(即 target 目錄)
mvn compile:編譯源代碼
mvn package:生成構件包(一般為 jar 包或 war 包)
mvn install:將構件包安裝到本地倉庫
mvn deploy:將構件包部署到遠程倉庫
執行 Maven 命令需要注意的是:必須在 Maven 項目的根目錄處執行,也就是當前目錄下一定存在一個名為 pom.xml 的文件。