什么是Maven,?
如今我們構(gòu)建一個項目需要用到很多第三方的類庫,,如寫一個使用Spring的Web項目就需要引入大量的jar包,。一個項目Jar包的數(shù)量之多往往讓我們瞠目結(jié)舌,,并且Jar包之間的關(guān)系錯綜復(fù)雜,一個Jar包往往又會引用其他Jar包,,缺少任何一個Jar包都會導(dǎo)致項目編譯失敗,。
以往開發(fā)項目時,程序員往往需要花較多的精力在引用Jar包搭建項目環(huán)境上,而這一項工作尤為艱難,,少一個Jar包,、多一個Jar包往往會報一些讓人摸不著頭腦的異常。
而Maven就是一款幫助程序員構(gòu)建項目的工具,,我們只需要告訴Maven需要哪些Jar 包,,它會幫助我們下載所有的Jar,極大提升開發(fā)效率,。
安裝Maven 和 Maven的Eclipse插件
http://blog.csdn.net/qjyong/article/details/9098213
Maven規(guī)定的目錄結(jié)構(gòu)
若要使用Maven,,那么項目的目錄結(jié)構(gòu)必須符合Maven的規(guī)范,其目錄結(jié)構(gòu)如下:
Maven基本命令
-
-v:查詢Maven版本
本命令用于檢查maven是否安裝成功,。
Maven安裝完成之后,,在命令行輸入mvn -v,若出現(xiàn)maven信息,,則說明安裝成功,。
-
compile:編譯
將java源文件編譯成class文件
-
test:測試項目
執(zhí)行test目錄下的測試用例
-
package:打包
將項目打成jar包
-
clean:刪除target文件夾
-
install:安裝
將當(dāng)前項目放到Maven的本地倉庫中。供其他項目使用
什么是Maven倉庫,?
Maven倉庫用來存放Maven管理的所有Jar包,。分為:本地倉庫 和 中央倉庫。
- 本地倉庫:Maven本地的Jar包倉庫,。
- 中央倉庫: Maven官方提供的遠(yuǎn)程倉庫,。
當(dāng)項目編譯時,Maven首先從本地倉庫中尋找項目所需的Jar包,,若本地倉庫沒有,,再到Maven的中央倉庫下載所需Jar包。
什么是“坐標(biāo)”,?
在Maven中,,坐標(biāo)是Jar包的唯一標(biāo)識,Maven通過坐標(biāo)在倉庫中找到項目所需的Jar包,。
如下代碼中,,groupId和artifactId構(gòu)成了一個Jar包的坐標(biāo)。
<groupId>cn.missbe.web.search</groupId> <artifactId>resource-search</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version>
- groupId:所需Jar包的項目名
- artifactId:所需Jar包的模塊名
- version:所需Jar包的版本號
傳遞依賴 與 排除依賴
- 傳遞依賴:如果我們的項目引用了一個Jar包,,而該Jar包又引用了其他Jar包,,那么在默認(rèn)情況下項目編譯時,Maven會把直接引用和簡潔引用的Jar包都下載到本地,。
- 排除依賴:如果我們只想下載直接引用的Jar包,,那么需要在pom.xml中做如下配置:(將需要排除的Jar包的坐標(biāo)寫在中)
<groupId>cn.missbe.web.search</groupId> <artifactId>resource-search</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version>
依賴范圍scope
在項目發(fā)布過程中,幫助決定哪些構(gòu)件被包括進(jìn)來,。欲知詳情請參考依賴機(jī)制,。
- compile :默認(rèn)范圍,,用于編譯
- provided:類似于編譯,但支持你期待jdk或者容器提供,,類似于classpath
- runtime: 在執(zhí)行時需要使用
- test: 用于test任務(wù)時使用
- system: 需要外在提供相應(yīng)的元素,。通過systemPath來取得
- systemPath: 僅用于范圍為system。提供相應(yīng)的路徑
- optional: 當(dāng)項目自身被依賴時,,標(biāo)注依賴是否傳遞,。用于連續(xù)依賴時使用
依賴沖突
若項目中多個Jar同時引用了相同的Jar時,會產(chǎn)生依賴沖突,,但Maven采用了兩種避免沖突的策略,,因此在Maven中是不存在依賴沖突的。
本項目——>A.jar——>B.jar——>X.jar
-
本項目——>A.jar——>B.jar——>X.jar
-
本項目——>C.jar——>X.jar
若本項目引用了A.jar,,A.jar又引用了B.jar,,B.jar又引用了X.jar,并且C.jar也引用了X.jar,。
在此時,,Maven只會引用引用路徑最短的Jar。
聚合
-
什么是聚合,?
將多個項目同時運(yùn)行就稱為聚合,。
-
如何實(shí)現(xiàn)聚合?
只需在pom中作如下配置即可實(shí)現(xiàn)聚合:
<module>web-connection-pool</module> <module>web-java-crawler</module>
繼承
-
什么是繼承,?
在聚合多個項目時,,如果這些被聚合的項目中需要引入相同的Jar,那么可以將這些Jar寫入父pom中,,各個子項目繼承該pom即可,。
-
如何實(shí)現(xiàn)繼承?
<groupId>cn.missbe.web.search</groupId> <artifactId>resource-search</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version>
<groupId>父pom所在項目的groupId</groupId> <artifactId>父pom所在項目的artifactId</artifactId> <version>父pom所在項目的版本號</version> <artifactId>resource-search</artifactId> <groupId>cn.missbe.web.search</groupId> <version>1.0-SNAPSHOT</version>
使用Maven構(gòu)建Web項目
-
New Maven項目:選擇WebApp:
-
若使用JSP,,需添加Servlet依賴:
注:Servlet依賴只在編譯和測試時使用!
<groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId>
-
在Bulid Path中設(shè)置resource輸出目錄:
-
勾選:Dynamic Web Module
-
刪掉測試目錄
-
在pom中加入jetty的插件,,并設(shè)置JDK版本:
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.3.10.v20160621</version>
-
運(yùn)行項目:
-
輸入:jetty:run
-
訪問127.0.0.1:8080
若出現(xiàn)如下界面,表示成功,!
pom.xml詳解
pom.xml是Maven的核心,,你的項目需要什么Jar包就在pom.xml里面配置。當(dāng)編譯項目時Maven讀取該文件,,并從倉庫中下載相應(yīng)的Jar包,。
<project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://maven./POM/4.0.0http://maven./maven-v4_0_0.xsd"> <!--父項目的坐標(biāo),。如果項目中沒有規(guī)定某個元素的值, 那么父項目中的對應(yīng)值即為項目的默認(rèn)值,。 坐標(biāo)包括group ID,,artifact ID和 version。--> <!--被繼承的父項目的構(gòu)件標(biāo)識符--> <!--被繼承的父項目的全球唯一標(biāo)識符--> <!--聲明項目描述符遵循哪一個POM模型版本,。模型本身的版本很少改變,,雖然如此, 但它仍然是必不可少的,,這是為了當(dāng)Maven引入了新的特性或者其他模型變更的時候,, <modelVersion>4.0.0</modelVersion> <!--項目的全球唯一標(biāo)識符,,通常使用全限定的包名區(qū)分該項目和其他項目,。 并且構(gòu)建時生成的路徑也是由此生成, 如com.mycompany.app生成的相對路徑為: <groupId>cn.missbe.web</groupId> <!-- 構(gòu)件的標(biāo)識符,,它和group ID一起唯一標(biāo)識一個構(gòu)件,。換句話說, 你不能有兩個不同的項目擁有同樣的artifact ID和groupID,;在某個 特定的group ID下,,artifact ID也必須是唯一的。構(gòu)件是項目產(chǎn)生的或使用的一個東西,, Maven為項目產(chǎn)生的構(gòu)件包括:JARs,,源碼,,二進(jìn)制發(fā)布和WARs等,。--> <artifactId>search-resources</artifactId> <!--項目產(chǎn)生的構(gòu)件類型,例如jar,、war,、ear,、pom。插件可以創(chuàng)建 他們自己的構(gòu)件類型,,所以前面列的不是全部構(gòu)件類型--> <packaging>war</packaging> <!--項目當(dāng)前版本,,格式為:主版本.次版本.增量版本-限定版本號--> <version>1.0-SNAPSHOT</version> <!--項目的名稱, Maven產(chǎn)生的文檔用--> <name>search-resources</name> <!--項目主頁的URL, Maven產(chǎn)生的文檔用--> <!-- 項目的詳細(xì)描述, Maven 產(chǎn)生的文檔用。 當(dāng)這個元素能夠用HTML格式描述時 (例如,,CDATA中的文本會被解析器忽略,,就可以包含HTML標(biāo) 簽), 不鼓勵使用純文本描述,。如果你需要修改產(chǎn)生的web站點(diǎn)的索引頁面,, 你應(yīng)該修改你自己的索引頁文件,而不是調(diào)整這里的文檔,。--> <description>A maven project to study maven.</description> <!--描述了這個項目構(gòu)建環(huán)境中的前提條件,。--> <!--構(gòu)建該項目或使用該插件所需要的Maven的最低版本--> <!--該元素設(shè)置了項目源碼目錄,,當(dāng)構(gòu)建項目的時候, 構(gòu)建系統(tǒng)會編譯目錄里的源碼,。該路徑是相對于pom.xml的相對路徑,。--> <!--該元素設(shè)置了項目腳本源碼目錄,該目錄和源碼目錄不同: 絕大多數(shù)情況下,,該目錄下的內(nèi)容 會被拷貝到輸出目錄(因?yàn)槟_本是被解釋的,,而不是被編譯的)。--> <!--該元素設(shè)置了項目單元測試使用的源碼目錄,,當(dāng)測試項目的時候,, 構(gòu)建系統(tǒng)會編譯目錄里的源碼。該路徑是相對于pom.xml的相對路徑,。--> <!--被編譯過的應(yīng)用程序class文件存放的目錄,。--> <!--被編譯過的測試class文件存放的目錄。--> <!--使用來自該項目的一系列構(gòu)建擴(kuò)展--> <!--描述使用到的構(gòu)建擴(kuò)展,。--> <!--構(gòu)建擴(kuò)展的groupId--> <!--構(gòu)建擴(kuò)展的artifactId--> <!--這個元素描述了項目相關(guān)的所有資源路徑列表,,例如和項目相關(guān)的屬性文件, <!--這個元素描述了項目相關(guān)或測試相關(guān)的所有資源路徑--> <!-- 描述了資源的目標(biāo)路徑,。該路徑相對target/classes目錄(例如${project.build.outputDirectory})。舉個例 子,,如果你想資源在特定的包里(org.apache.maven.messages),,你就必須該元素設(shè)置為org/apache/maven /messages。 然而,,如果你只是想把資源放到源碼目錄結(jié)構(gòu)里,,就不需要該配置。--> <!--是否使用參數(shù)值代替參數(shù)名,。參數(shù)值取自properties元素或者文件里配置的屬性,, <!--描述存放資源的目錄,,該路徑相對POM路徑--> <!--包含的模式列表,,例如**/*.xml.--> <!--排除的模式列表,例如**/*.xml--> <!--這個元素描述了單元測試相關(guān)的所有資源路徑,,例如和單元測試相關(guān)的屬性文件,。--> <!--這個元素描述了測試相關(guān)的所有資源路徑,參見build/resources/resource元素的說明--> <targetPath/><filtering/><directory/><includes/><excludes/> <!--構(gòu)建產(chǎn)生的所有文件存放的目錄--> <!--產(chǎn)生的構(gòu)件的文件名,,默認(rèn)值是${artifactId}-${version},。--> <!--當(dāng)filtering開關(guān)打開時,使用到的過濾器屬性文件列表--> <!--子項目可以引用的默認(rèn)插件信息,。該插件配置項直到被引用時才會被解析或綁定到生命周期,。 <!--plugin元素包含描述插件所需要的信息,。--> <!--插件在倉庫里的artifact ID--> <!--是否從該插件下載Maven擴(kuò)展(例如打包和類型處理器),,由于性能原因, 只有在真需要下載時,,該元素才被設(shè)置成enabled,。--> <!--在構(gòu)建生命周期中執(zhí)行一組目標(biāo)的配置。每個目標(biāo)可能有不同的配置,。--> <!--execution元素包含了插件執(zhí)行需要的信息--> <!--執(zhí)行目標(biāo)的標(biāo)識符,,用于標(biāo)識構(gòu)建過程中的目標(biāo),或者匹配繼承過程中需要合并的執(zhí)行目標(biāo)--> <!--綁定了目標(biāo)的構(gòu)建生命周期階段,,如果省略,,目標(biāo)會被綁定到源數(shù)據(jù)里配置的默認(rèn)階段--> <!--配置的執(zhí)行目標(biāo)--> <!--參見dependencies/dependency元素--> <!--參見build/pluginManagement/plugins/plugin元素--> <groupId/><artifactId/><version/><extensions/> <id/><phase/><goals/><inherited/><configuration/> <!--參見dependencies/dependency元素--> <goals/><inherited/><configuration/> <!--模塊(有時稱作子項目) 被構(gòu)建成項目的一部分。 列出的每個模塊元素是指向該模塊的目錄的相對路徑--> <!--發(fā)現(xiàn)依賴和擴(kuò)展的遠(yuǎn)程倉庫列表,。--> <!--包含需要連接到遠(yuǎn)程倉庫的信息--> <!--如何處理遠(yuǎn)程倉庫里發(fā)布版本的下載--> <!--true或者false表示該倉庫是否為下載某種類型構(gòu)件(發(fā)布版,,快照版)開啟。 --> <!--該元素指定更新發(fā)生的頻率,。Maven會比較本地POM和遠(yuǎn)程POM的時間戳,。這里的選項是:always(一直),daily(默認(rèn),,每日),,interval:X(這里X是以分鐘為單位的時間間隔),或者never(從不),。--> <!--當(dāng)Maven驗(yàn)證構(gòu)件校驗(yàn)文件失敗時該怎么做:ignore(忽略),,fail(失敗),,或者warn(警告),。--> <!-- 如何處理遠(yuǎn)程倉庫里快照版本的下載。有了releases和snapshots這兩組配置,, POM就可以在每個單獨(dú)的倉庫中,,為每種類型的構(gòu)件采取不同的 策略。 例如,,可能有人會決定只為開發(fā)目的開啟對快照版本下載的支持,。 參見repositories/repository/releases元素 --> <enabled/><updatePolicy/><checksumPolicy/> <!--遠(yuǎn)程倉庫唯一標(biāo)識符??梢杂脕砥ヅ湓趕ettings.xml文件里配置的遠(yuǎn)程倉庫--> <id>banseon-repository-proxy</id> <name>banseon-repository-proxy</name> <!--遠(yuǎn)程倉庫URL,,按protocol://hostname/path形式--> <url>http://192.168.1.169:9999/repository/</url> <!-- 用于定位和排序構(gòu)件的倉庫布局類型-可以是default(默認(rèn))或者legacy(遺留)。Maven 2為其倉庫提供了一個默認(rèn)的布局,;然 而,,Maven 1.x有一種不同的布局,。我們可以使用該元素指定布局是default(默認(rèn))還是legacy(遺留)。--> <!--發(fā)現(xiàn)插件的遠(yuǎn)程倉庫列表,,這些插件用于構(gòu)建和報表--> <!--包含需要連接到遠(yuǎn)程插件倉庫的信息.參見repositories/repository元素--> <!--該元素描述了項目相關(guān)的所有依賴,。 這些依賴組成了項目構(gòu)建過程中的一個個環(huán)節(jié)。 它們自動從項目定義的倉庫中下載,。要獲取更多信息,,請看項目依賴機(jī)制。--> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact</artifactId> <!--依賴的版本號,。 在Maven 2里, 也可以配置成版本號的范圍,。--> <!-- 依賴類型,默認(rèn)類型是jar,。它通常表示依賴的文件的擴(kuò)展名,,但也有例外 。一個類型可以被映射成另外一個擴(kuò)展名或分類器,。類型經(jīng)常和使用的打包方式對應(yīng),, 盡管這也有例外。一些類型的例子:jar,,war,,ejb-client和test-jar。 如果設(shè)置extensions為 true,,就可以在 plugin里定義新的類型,。所以前面的類型的例子不完整。--> <!-- 依賴的分類器,。分類器可以區(qū)分屬于同一個POM,,但不同構(gòu)建方式的構(gòu)件。 分類器名被附加到文件名的版本號后面,。例如,,如果你想要構(gòu)建兩個單獨(dú)的構(gòu)件成 JAR, 一個使用Java 1.4編譯器,,另一個使用Java 6編譯器,,你就可以使用分類器來生成兩個單獨(dú)的JAR構(gòu)件。--> <classifier></classifier> <!--依賴范圍,。在項目發(fā)布過程中,,幫助決定哪些構(gòu)件被包括進(jìn)來。欲知詳情請參考依賴機(jī)制,。 - compile :默認(rèn)范圍,,用于編譯 - provided:類似于編譯,但支持你期待jdk或者容器提供,類似于classpath - system: 需要外在提供相應(yīng)的元素,。通過systemPath來取得 - systemPath: 僅用于范圍為system,。提供相應(yīng)的路徑 - optional: 當(dāng)項目自身被依賴時,標(biāo)注依賴是否傳遞,。用于連續(xù)依賴時使用--> <!--僅供system范圍使用,。注意,不鼓勵使用這個元素,, 并且在新的版本中該元素可能被覆蓋掉。該元素為依賴規(guī)定了文件系統(tǒng)上的路徑,。 需要絕對路徑而不是相對路徑,。推薦使用屬性匹配絕對路徑,例如${java.home},。--> <systemPath></systemPath> <!--當(dāng)計算傳遞依賴時,, 從依賴構(gòu)件列表里,列出被排除的依賴構(gòu)件集,。 即告訴maven你只依賴指定的項目,,不依賴項目的依賴。此元素主要用于解決版本沖突問題--> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> <!--可選依賴,,如果你在項目B中把C依賴聲明為可選,,你就需要在依賴于B的項目(例如項目A)中顯式的引用對C的依賴??蛇x依賴阻斷依賴的傳遞性,。--> <optional>true</optional> <!-- 繼承自該項目的所有子項目的默認(rèn)依賴信息。這部分的依賴信息不會被立即解析, 而是當(dāng)子項目聲明一個依賴(必須描述group ID和 artifact ID信息),, 如果group ID和artifact ID以外的一些信息沒有描述,, 則通過group ID和artifact ID 匹配到這里的依賴,并使用這里的依賴信息,。--> <!--參見dependencies/dependency元素--> <!--項目分發(fā)信息,,在執(zhí)行mvn deploy后表示要發(fā)布的位置。 有了這些信息就可以把網(wǎng)站部署到遠(yuǎn)程服務(wù)器或者把構(gòu)件部署到遠(yuǎn)程倉庫,。--> <!--部署項目產(chǎn)生的構(gòu)件到遠(yuǎn)程倉庫需要的信息--> <!--是分配給快照一個唯一的版本號(由時間戳和構(gòu)建流水號),? 還是每次都使用相同的版本號?參見repositories/repository元素--> <name>banseon maven2</name> <url>file://${basedir}/target/deploy</url> <!--構(gòu)件的快照部署到哪里,?如果沒有配置該元素,,默認(rèn)部署到repository元素配置的倉庫, 參見distributionManagement/repository元素--> <name>Banseon-maven2 Snapshot Repository</name> <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url> <!--部署項目的網(wǎng)站需要的信息--> <!--部署位置的唯一標(biāo)識符,,用來匹配站點(diǎn)和settings.xml文件里的配置--> <name>business api website</name> <!--部署位置的URL,,按protocol://hostname/path形式--> scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web <!--項目下載頁面的URL。如果沒有該元素,用戶應(yīng)該參考主頁,。 使用該元素的原因是:幫助定位那些不在倉庫里的構(gòu)件(由于license限制),。--> <!-- 給出該構(gòu)件在遠(yuǎn)程倉庫的狀態(tài)。不得在本地項目中設(shè)置該元素,, 因?yàn)檫@是工具自動更新的,。有效的值有:none(默認(rèn)), converted(倉庫管理員從 Maven 1 POM轉(zhuǎn)換過來),,partner(直接從伙伴Maven 2倉庫同步過來),,deployed(從Maven 2實(shí)例部 署),verified(被核實(shí)時正確的和最終的),。--> </distributionManagement> <!--以值替代名稱,,Properties可以在整個POM中使用,也可以作為觸發(fā)條件(見settings.xml配置文件里activation元素的說明),。格式是<name>value</name>,。-->
參考原文:Maven使用詳解
|