Maven概述
-
Maven定義
- Maven是一個項目管理和整合,統(tǒng)一管理jar包的工具;
- Maven為開發(fā)者提供了一套完整的構(gòu)建生命周期框架,可以讓開發(fā)團(tuán)隊快速完成工程的基礎(chǔ)構(gòu)建配置,因為Maven使用了標(biāo)準(zhǔn)的目錄結(jié)構(gòu)和默認(rèn)的生命周期;
- Maven能夠幫助開發(fā)者完成構(gòu)建、文檔生成、報告、依賴、SCMs、發(fā)布、分發(fā)和郵件列表;
-
總結(jié)
- Maven簡化了工程的構(gòu)建過程,并對其標(biāo)準(zhǔn)化;
- 銜接了編譯、發(fā)布、文檔生成、團(tuán)隊合作和其他;
- Maven提高了重用性,負(fù)責(zé)大部分構(gòu)建任務(wù);
Maven歷史
Maven最初是在Jakarta-Turbine項目中為了簡化構(gòu)建過程而設(shè)計的。項目中有幾個子工程,每個工程包含稍有不同的 ANT 文件。JAR 文件使用 CVS 管理。
Apache 小組隨后開發(fā)了Maven,能夠同時構(gòu)建多個工程、發(fā)布工程信息、部署工程、在幾個工程中共享 JAR 文件,并且協(xié)助團(tuán)隊合作。-
Maven目的
- 主要是為開發(fā)這提供一個可復(fù)用、可維護(hù)、更易理解的工程綜合模型
- 以及與這個模型交互的插件或者工具
Maven宗旨
始終貫徹一句話:約定優(yōu)于配置
開發(fā)者不需要關(guān)心每一個配置細(xì)節(jié)。當(dāng)創(chuàng)建Maven工程時,Maven會創(chuàng)建默認(rèn)的工程結(jié)構(gòu),開發(fā)者只需要合理防止文件,在pom.xml中不需要再定義任何配置;
例如: Maven工程的默認(rèn)結(jié)構(gòu)(假定${basedir}表示工程目錄)
| 配置項 | 默認(rèn)值 |
|---|---|
| 源代碼 | ${basedir}/src/main/java |
| 配置文件 | ${basedir}/src/main/resources |
| 測試文件 | ${basedir}/src/test |
| 打包的jar包 | ${basedir}/target |
| 編譯后的文件(字節(jié)碼文件) | ${basedir}/target/classes |
Maven環(huán)境配置
- 系統(tǒng)要求
| 項目 | 要求 |
|---|---|
| JDK | Maven3.3要求JDK1.7或以上 Maven3.2要求JDK1.6或以上 Maven3.0/3.1要求JDK1.5或以上 |
| 內(nèi)存 | 沒有最低要求 |
| 磁盤 | Maven自身安裝大約10MB空間,除此之外,都是用來存放本地倉庫的jar包,預(yù)期至少500MB |
| 操作系統(tǒng) | 沒有最低要求 |
- 配置步驟
- 檢查Java安裝(JDK)
打開操作系統(tǒng)的命令行,然后輸入命令:java -version - Java環(huán)境配置
| 操作系統(tǒng) | 設(shè)置 |
|---|---|
| Windows | 環(huán)境變量 JAVA_HOME = Java的JDK安裝目錄,然后將JAVA_HOME添加到系統(tǒng)的環(huán)境變量Path后面 |
| Linux | export JAVA_HOME=/usr/local/java-current,然后export PATH=PATH:JAVA_HOME/bin/ |
| Mac | export JAVA_HOME=/Library/Java/Home |
- 下載Maven文件
從http://maven.apache.org/download.html下載Maven3.2.5 - 解壓并配置Maven環(huán)境變量
解壓文件,安裝Maven3.2.5得到子目錄apache-maven-3.2.5
| 操作系統(tǒng) | 設(shè)置 |
|---|---|
| Windows | 使用系統(tǒng)屬性設(shè)置環(huán)境變量 M2_HOME=C:\dictionary\apache-maven-3.2.5 M2=%M2_HOME%\bin MAVEN_OPTS=-Xms256m -Xmx512m,然后添加“;%M2%”到Path變量后面 |
| 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 最后export PATH=M2:PATH |
| 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 最后export PATH=M2:PATH |
- 驗證Maven安裝
打開操作系統(tǒng)的命令行,然后輸入命令:mvn -version
Maven倉庫
-
定義
Maven倉庫:倉庫是一個位置,可以存儲所有工程的jar文件,library jar文件,插件或者其他工程指定的文件; -
類型
-
本地倉庫
- Maven本地倉庫是本地機(jī)器上的一個文件夾,在第一次運(yùn)行任何maven命令的時候創(chuàng)建;
- 本地倉庫在運(yùn)行maven構(gòu)建后,會自動下載并保存工程中需要的所有依賴、插件等到本地倉庫中,避免每次構(gòu)建都需要去遠(yuǎn)程倉庫引用;
- 本地倉庫的默認(rèn)路徑在User/用戶名/.m2下,如果需要重新定義位置,可以在settings.xml文件中的localRepository標(biāo)簽中定義新的存放位置;
-
中央倉庫
- 由Maven社區(qū)提供的倉庫,包含了大量常用的庫;
- 這個倉庫由Maven社區(qū)管理;
- 不需要用戶手動配置;
- 需要通過網(wǎng)絡(luò)才能訪問;
- 搜索Maven中央倉庫的jar包依賴:http://search.maven.org/#browse
-
遠(yuǎn)程倉庫
- 遠(yuǎn)程倉庫是為了解決Maven在中央倉庫找不到依賴的庫文件而停止構(gòu)建并報錯這種情況;
- 遠(yuǎn)程倉庫是開發(fā)人員你自己定制的倉庫,包含了自己需要的代碼或者其他項目需要的jar文件;
-
本地倉庫
構(gòu)建配置文件
- 定義
- 構(gòu)建配置文件是一組配置的集合,用來設(shè)置或者覆蓋Maven構(gòu)建的默認(rèn)配置,使用構(gòu)建配置文件,可以為不同的環(huán)境定制構(gòu)建過程,例如pro和dev環(huán)境。
- Profile在pom.xml中使用activeProfiles/profiles元素指定,而且可以用多種方式觸發(fā),Profile在構(gòu)建時修改POM,并且為變量設(shè)置不同的目標(biāo)環(huán)境,例如日志環(huán)境,kafka環(huán)境。
-
Profile
-
Profile類型
類型 使用 Pre Project 定義在POM文件的pom.xml中 Per User 定義在Maven設(shè)置xml文件中(%USER_HOME%/.m2/settings.xml) Global 定義在Maven全局配置xml文件中(%USER_HOME%/conf/settings.xml) Profile激活方法
- 顯式使用命令控制臺輸入
- 通過maven設(shè)置
- 基于環(huán)境變量(用戶/系統(tǒng)變量)
- 操作系統(tǒng)配置
- 現(xiàn)存/缺失文件
-
Maven POM
-
POM前言
定義:- POM代表工程對象模型,是使用Maven工作的基本組件,是一個xml文件,被放在工程根目錄下,命名為pom.xml;
- POM包含了工程和各種配置細(xì)節(jié)的信息;
- POM也包含了目標(biāo)和插件;
注意:
- 每個工程只有一個POM文件;
- 所有的POM文件需要根元素(project元素)和三個必須字段:groupId,artifactId,version;
- 在倉庫中的工程標(biāo)識為:groupId:artifactId:version;
-
POM用途
- pom.xml用來定義Maven工程結(jié)構(gòu)和內(nèi)容,是Project Object Model的簡稱;
- pom.xml是整個Maven系統(tǒng)的基礎(chǔ)組件;
-
POM配置詳解
-
POM配置組成
POM的模型版本:modelVersion標(biāo)簽,在Maven2和Maven3中,只支持4.0.0版本
基本配置
配置名稱 描述 dependencies 項目引用插件所需要的額外的依賴 groupId 項目組ID artifactId 構(gòu)件的標(biāo)識符,它和groupId一起唯一標(biāo)識一個構(gòu)件 version 項目版本 packaging 項目打包方式,例如jar、war、ear、pom parent 引用的父項目 modules 引用的模塊 properties 自定義的各種必要屬性,在文件中可以使用${屬性名}來引用 - build配置
配置名稱 描述 build 構(gòu)建項目需要的信息,主要標(biāo)簽:Resources(用于排除或者包含一些資源文件)和Plugins(設(shè)置構(gòu)建的插件) reporting 使用報表插件產(chǎn)生的報表規(guī)范,當(dāng)用戶執(zhí)行“mvn site”,這些報表就會運(yùn)行 - 項目信息配置
配置名稱 描述 issueManagement 給出defect tracking system及其訪問URL ciManagement 給出Continuous Integration Management、其URL和notifier(集成過程中發(fā)生事件,以某種方式(如mail)通知開發(fā)人員) scm(software configuration management) connection、developerConnection、tag、url distributionManagement 構(gòu)件的發(fā)布管理 prerequisites POM執(zhí)行的前提條件,目前只支持對Maven版本的要求 mailingLists 開發(fā)人員或用戶的郵件列表(name、subscribe、unsubscribe、post、archive、otherArchives) - 環(huán)境配置
配置名稱 描述 name 項目的名稱代號 description 項目說明 url 項目官網(wǎng)url inceptionYear 項目開發(fā)年份 licenses 可以包含多個license,以及子屬性:name(license名稱)、url(license可訪問的url地址)、distribution(license發(fā)布方式)、comments(license說明) organization 包含組織的name,組織的官網(wǎng)url developers developer中包含id、name、email、url、organization、organizationUrl、roles、timezone、properties contributors contributor包含除了id之外的所有developer屬性 POM元素繼承
元素繼承的原因:為了減少重復(fù)代碼的編寫,需要創(chuàng)建POM的父子結(jié)構(gòu),在父POM中申明一些供子POM繼承的配置,實現(xiàn)“一處申明,多處使用”。
-
可繼承的POM元素:
- groupId:項目組ID,項目坐標(biāo)的核心元素
- version:項目版本,項目坐標(biāo)的核心因素
- description:項目的描述信息
- organization:項目的組織信息
- inceptionYear:項目的創(chuàng)始年份
- url:項目的URL地址
- developers:項目的開發(fā)者信息
- contributors:項目的貢獻(xiàn)者信息
- distributionManagement:項目的部署配置
- issueManagement:項目的缺陷跟蹤系統(tǒng)信息
- ciManagement:項目的持續(xù)集成系統(tǒng)信息
- scm:項目的版本控制系統(tǒng)西溪
- malilingLists:項目的郵件列表信息
- properties:自定義的Maven屬性
- dependencies:項目的依賴配置
- dependencyManagement:項目的依賴管理配置
- repositories:項目的倉庫配置
- build:包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等
- reporting:包括項目的報告輸出目錄配置、報告插件配置等
-
聚合與繼承的關(guān)系
- 區(qū)別
- 聚合模塊知道那些被聚合的模塊,但被聚合的模塊不知道聚合模塊的存在;
- 對于繼承關(guān)系的父POM來說,不知道繼承的字模塊有哪些,但是字模塊必須知道自己的父POM是什么。
- 共同點(diǎn)
- 聚合POM與繼承關(guān)系中的父POM的packaging都是pom;
- 聚合模塊與繼承關(guān)系中的父模塊除了POM之外都沒有實際內(nèi)容。
- 區(qū)別
-
依賴管理
依賴是使用Maven坐標(biāo)來定位的,而Maven坐標(biāo)主要由GAV(groupId, artifactId, version)構(gòu)成。
在實際項目中,會存在pom文件,這時,如果不進(jìn)行依賴管理,則會出現(xiàn)同一個依賴模塊可能在不同的pom中都會出現(xiàn),這就造成了重復(fù)依賴,在Maven中消除這種重復(fù)依賴的正確做法是:
1.在父模塊中使用dependencyManagement配置依賴;
2.在子模塊中使用dependencies添加依賴;
dependencyManagement實際上不會真正引入任何依賴,dependencies才會。但是,當(dāng)父模塊中配置了某個依賴之后,子模塊只需使用簡單groupId和artifactId就能自動繼承相應(yīng)的父模塊依賴配置。-
依賴歸類
依賴歸類主要體現(xiàn)在依賴groupId相同的jar包的版本控制,例如依賴了spring相關(guān)jar包,spring-context、spring-core,要保證版本號相同,版本號不同,有時會出現(xiàn)兼容性問題。解決方法是在pom.xml中定義:<properties> <spring.version>2.5</spring.version> </properties> <dependencies> <dependency> <groupId>org.spring.framework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.spring.framework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies> -
依賴范圍
作用域變量名 編譯時有效 測試時有效 運(yùn)行時有效 示例 compile √ √ √ smart-framework.jar(默認(rèn)) test -- √ -- junit.jar runtime -- √ √ mysql-connector-java.jar provided √ √ -- servlet-api.jar system √ √ -- JDK的rt.jar -
分類器
分類器的命名模式為:artifactId-version-classifier.packaging
例如:<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>5.7</version> <classifier>jdk15</classifier> </dependency>
分類器的用途:用來聲明對test構(gòu)件的依賴,比如我們在核心模塊中聲明了一些基礎(chǔ)類,結(jié)果發(fā)現(xiàn)這個基礎(chǔ)類對其他模塊的測試類都有用,我們就可以把這個基礎(chǔ)類打包成artifactId-version-test.jar,例如:
<dependency> <groupId>org.myorg.myapp</groupId> <artifactId>core</artifactId> <version>${project.version}</version> <classifier>test</classifier> </dependency> -
生命周期
Maven強(qiáng)大的一個重要的原因是它有一個十分完善的生命周期模型(lifecycle),這個生命周期可以從兩方面來理解:
- 顧名思義,運(yùn)行Maven的每個步驟都由它來定義的,這種預(yù)定義的默認(rèn)行為使得我們使用Maven變得簡單,相比而言,Ant的每個步驟都要你手工去定義;
- 這個模型是一種標(biāo)準(zhǔn),在不同的項目中,使用Maven的接口是一樣的,這樣就不用去仔細(xì)理解每個項目的構(gòu)建了,一般情況下,mvn clean install 這樣的命令是通用的。
Maven有三套、相互獨(dú)立的生命周期
| 生命周期 | 描述 |
|---|---|
| clean | 在進(jìn)行真正構(gòu)建之前作一些清理工作 |
| default(or build) | 構(gòu)建的核心部分,編譯、測試、打包、部署等等 |
| site | 用來生成項目報告、站點(diǎn)、發(fā)布站點(diǎn) |
注意:你可以僅僅調(diào)用clean來清理工作目錄,也可以僅僅調(diào)用site來生成站點(diǎn),也可以直接使用mvn clean install site完成這一套生命周期。
clean
當(dāng)運(yùn)行mvn clean時,clean生命周期一共包含了三個階段:
| 階段名稱 | 描述 |
|---|---|
| pre-clean | 執(zhí)行一些需要在clean之前完成的工作 |
| clean | 移除所有上一次構(gòu)建生成的文件 |
| post-clean | 執(zhí)行一些需要在clean之后立刻完成的工作 |
注意:mvn clean 中的clean就是上面的clean,在一個生命周期中,運(yùn)行某個階段的時候,它之前的所有階段都會被運(yùn)行,也就是說,mvn clean 等同于 mvn pre-clean clean ,如果我們運(yùn)行 mvn post-clean ,那么 pre-clean,clean 都會被運(yùn)行。
site
| 階段名稱 | 描述 |
|---|---|
| pre-site | 執(zhí)行一些要在生成項目站點(diǎn)文檔前完成的工作 |
| site | 生成項目的站點(diǎn)文檔 |
| post-site | 執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備 |
| site-deploy | 將生成的站點(diǎn)文檔部署到特定的服務(wù)器上 |
經(jīng)常會用到site階段和site-deploy階段,用以生成和發(fā)布Maven站點(diǎn),完成文檔和統(tǒng)計數(shù)據(jù)自動生成。
default(or build)
| 階段名稱 | 描述 |
|---|---|
| validate | 檢查工程配置是否正確,完成構(gòu)建過程的所有必要信息是否能夠獲取到 |
| initialize | 初始化構(gòu)建狀態(tài),例如設(shè)置屬性 |
| generate-sources | 生成編譯階段需要包含的任何源碼文件 |
| process-sources | 處理源代碼,例如過濾任何值 |
| generate-resources | 生成工程包中需要包含的資源文件 |
| process-resources | 拷貝和處理資源文件到目的目錄中,為打包階段做準(zhǔn)備 |
| compile | 編譯工程源碼 |
| process-classes | 處理編譯生成的文件,例如Java Class 字節(jié)碼的加強(qiáng)和優(yōu)化 |
| generate-test-sources | 生成編譯階段需要包含的任何測試源代碼 |
| process-test-sources | 處理測試源代碼,例如過濾任何值 |
| test-compile | 編譯測試源代碼到測試目錄 |
| process-test-classes | 處理測試代碼文件編譯后生成的文件 |
| test | 使用適當(dāng)?shù)膯卧獪y試框架(例如JUnit)運(yùn)行測試 |
| prepare-package | 在真正打包之前,為準(zhǔn)備打包執(zhí)行任何必要的操作 |
| package | 獲取編譯后的代碼,并按照可發(fā)布的格式進(jìn)行打包,例如JAR、WAR或者EAR文件 |
| pre-integration-test | 在集成測試執(zhí)行之前,執(zhí)行所需的操作。例如設(shè)置所需的環(huán)境變量 |
| integration-test | 處理和部署必須的工程包到集成測試能夠運(yùn)行的環(huán)境中 |
| post-integration-test | 在集成測試被執(zhí)行后執(zhí)行必要的操作。例如清理環(huán)境 |
| verify | 運(yùn)行檢查操作來驗證工程包是有效的,并滿足質(zhì)量要求 |
| install | 安裝工程包到本地倉庫中,該倉庫可以作為本地其他工程的依賴 |
| deploy | 拷貝最終的工程包到遠(yuǎn)程倉庫中,以共享給其他開發(fā)人員和工程 |
注意:運(yùn)行任何一個階段,它前面的所有階段都會被運(yùn)行,這就是當(dāng)我們運(yùn)行mvn install時,代碼會被編譯、測試、打包的原因;而且,Maven的插件機(jī)制是完全依賴Maven的生命周期的。
Maven插件
-
插件和生命周期
使用mvn clean install構(gòu)建Maven項目時:生命周期階段 插件 clean clean插件 compile compile插件 process-test-resources resources插件 test-compile compiler插件 test surefire插件 package war/jar插件 install install插件 插件配置
有一個compiler常用的配置,因為compiler插件默認(rèn)使用的是Java1.4的標(biāo)準(zhǔn)來編譯源代碼的,如果代碼中用到了Java1.5的新特性,這樣就會編譯報錯,所以要進(jìn)行配置compiler插件支持Java 1.5;
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
Maven版本管理
-
定義
- 版本管理不是指的版本控制,版本指的是artifact的版本,而不是指源碼的版本;
- 版本號我們可以通過修改pom中version之后,在構(gòu)建一次就能改變,但是這樣修改當(dāng)我們同一個項目中有多個模塊,這樣改就會很麻煩;所以我們要了解如何自動化發(fā)布版本;
SNASHOT
SNAPSHOT是不穩(wěn)定版本,還在開發(fā)中,每天都會提交新的代碼,會頻繁地發(fā)布新的版本;RELEASE
RELEASE是一段時間內(nèi)的穩(wěn)定版本,經(jīng)過了多個SNAPSHOT版本;Maven版本規(guī)則
規(guī)則:<主版本>.<次版本>.<增量版本>;
主版本一般都是項目發(fā)生了大的架構(gòu)變更;
此版本一般只是增加了一些功能,或者原有功能的修改;
增量版本則是修改的一些輕微的bug;-
相關(guān)插件
maven-release-plugin,這個插件會幫助我們升級pom版本,提交,打tag,然后再升級版本,再提交,等等,使用方法:<distributionManagement> <snapshotRepository> <id>nexus-snapshots</id> <name>Project SNAPSHOTS</name> <url>http://nexus.ops.7mxing.com/repository/maven-snapshots/</url> </snapshotRepository> <repository> <id>nexus-releases</id> <name>Project Release</name> <url>http://nexus.ops.7mxing.com/repository/maven-releases/</url> </repository> </distributionManagement> <!-- 發(fā)布插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>xxx</version> </plugin>