Maven使用入門
1. Maven概述
Maven是什么瘫想?
Maven項(xiàng)目對(duì)象模型(POM)蚊惯,可以通過(guò)一小段描述信息來(lái)管理項(xiàng)目的構(gòu)建创倔,報(bào)告和文檔的軟件項(xiàng)目管理工具翔脱。
為什么要使用Maven瘩扼?
Maven 除了以程序構(gòu)建能力為特色之外谆甜,還提供高級(jí)項(xiàng)目管理工具。由于 Maven 的缺省構(gòu)建規(guī)則有較高的可重用性集绰,所以常常用兩三行 Maven 構(gòu)建腳本就可以構(gòu)建簡(jiǎn)單的項(xiàng)目规辱。由于 Maven 的面向項(xiàng)目的方法,許多 Apache Jakarta 項(xiàng)目發(fā)文時(shí)使用 Maven栽燕,而且公司項(xiàng)目采用 Maven 的比例在持續(xù)增長(zhǎng)罕袋。
Maven的特點(diǎn)
Maven 和 Ant 有什么不同呢?在回答這個(gè)問(wèn)題以前碍岔,首先要強(qiáng)調(diào)一點(diǎn):Maven 和 Ant 針對(duì)構(gòu)建問(wèn)題的兩個(gè)不同方面浴讯。Ant 為 Java 技術(shù)開發(fā)項(xiàng)目提供跨平臺(tái)構(gòu)建任務(wù)。Maven 本身描述項(xiàng)目的高級(jí)方面蔼啦,它從 Ant 借用了絕大多數(shù)構(gòu)建任務(wù)榆纽。因此,由于 Maven 和 Ant代表兩個(gè)差異很大的工具,所以接下來(lái)只說(shuō)明這兩個(gè)工具的等同組件之間的區(qū)別奈籽,如表 1 所示:
Maven常用命令
mvn archetype:generate 創(chuàng)建Maven項(xiàng)目
mvn compile 編譯源代碼
mvn deploy 發(fā)布項(xiàng)目
mvn test-compile 編譯測(cè)試源代碼
mvn test 運(yùn)行應(yīng)用程序中的單元測(cè)試
mvn site 生成項(xiàng)目相關(guān)信息的網(wǎng)站
mvn clean 清除項(xiàng)目目錄中的生成結(jié)果
mvn package 根據(jù)項(xiàng)目生成的jar
mvn install 在本地Repository中安裝jar
mvn eclipse:eclipse 生成eclipse項(xiàng)目文件
mvnjetty:run 啟動(dòng)jetty服務(wù)
mvntomcat:run 啟動(dòng)tomcat服務(wù)
mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包饥侵,跳過(guò)測(cè)試類
Maven的基本功能
? 構(gòu)建:比如生成class、jar衣屏、war或者ear文件
? 生成文檔:比如生成javadoc躏升、網(wǎng)站文檔
? 生成報(bào)告:比如junit測(cè)試報(bào)告
? 生成依賴類庫(kù):生成文檔,說(shuō)明項(xiàng)目多其他軟件的依賴
? 有關(guān)SCM:SCM(Software Configuration Management)狼忱,軟件配置管理膨疏,比如版本控制,比如bug管理等等
? 發(fā)布:生成供發(fā)布的分發(fā)包钻弄,比如生成Struts2的分發(fā)包佃却,供提交給用戶使用
? 部署:比如,web應(yīng)用程序斧蜕,自動(dòng)部署到指定的服務(wù)器上
maven的其他優(yōu)勢(shì)
- maven不僅是構(gòu)建工具双霍,它還是依賴管理工具和項(xiàng)目管理工具砚偶,提供了中央倉(cāng)庫(kù)批销,能夠幫我們自動(dòng)下載構(gòu)件。
- 為了解決的依賴的增多染坯,版本不一致均芽,版本沖突,依賴臃腫等問(wèn)題单鹿,它通過(guò)一個(gè)坐標(biāo)系統(tǒng)來(lái)精確地定位每一個(gè)構(gòu)件(artifact)掀宋。
- 幫助我們分散在各個(gè)角落的項(xiàng)目信息,包括項(xiàng)目描述仲锄,開發(fā)者列表劲妙,版本控制系統(tǒng),許可證儒喊,缺陷管理系統(tǒng)地址镣奋。
- maven還為全世界的java開發(fā)者提供了一個(gè)免費(fèi)的中央倉(cāng)庫(kù),在其中幾乎可以找到任何的流行開源軟件怀愧。通過(guò)衍生工具(Nexus),我們還能對(duì)其進(jìn)行快速搜索
- maven對(duì)于目錄結(jié)構(gòu)有要求侨颈,約定優(yōu)于配置,用戶在項(xiàng)目間切換就省去了學(xué)習(xí)成本芯义。
2. Maven 安裝以及eclipse配置
- 在apche官方網(wǎng)站http://maven.apache.org/download.cgi 下載bin哈垢;
-
下載下來(lái)之后,解壓扛拨,找個(gè)路徑放進(jìn)去耘分, 把bin的位置設(shè)在環(huán)境變量里,新建環(huán)境變量MAVEN_HOME;
-
在PATH里加入maven的bin的路徑求泰;
- 由于Maven依賴Java運(yùn)行環(huán)境啤贩,因此使用Maven之前需要配置Java的運(yùn)行環(huán)境。下載并安裝JDK拜秧,配置JDK的環(huán)境變量JAVA_HOME痹屹,否則maven將無(wú)法使用;
-
配置完畢后枉氮,在Windows命令提示符下志衍,輸入mvn -v測(cè)試一下,配置成功顯示如圖:
-
配置成功后開始在Eclipse中配置Maven,點(diǎn)擊eclipse菜單欄Help->Eclipse Marketplace搜索關(guān)鍵字maven到插件Maven Integration for Eclipse 并點(diǎn)擊安裝即可聊替,如下圖:
- 安裝完畢后楼肪,點(diǎn)擊重啟eclipse力九;
-
重啟后千埃,為了使得Eclipse中安裝的Maven插件,同windows中安裝的那個(gè)相同碾褂,需要讓eclipse中的maven重新定位一下泣港,點(diǎn)擊Window -> Preference -> Maven -> Installation -> Add進(jìn)行設(shè)置
-
然后暂殖, 我們?cè)贛aven的配置界面,設(shè)置User Settings Global Settings選擇maven 安裝目錄下conf文件夾下的settings.xml当纱,這里我的Maven安裝目錄為D:\apache-maven-3.5.2\conf\settings.xml呛每,選擇你的Maven安裝目錄,檢查L(zhǎng)ocal Repository 項(xiàng)坡氯,如果為D:\Qrsoft\maven\repository則配置成功晨横,否則重新配置上一步。
- 設(shè)置成功即安裝完成箫柳。
3. 使用
3.1 創(chuàng)建Maven項(xiàng)目
-
我們?cè)贓clipse菜單欄中點(diǎn)擊File->New->Other->Maven,在彈出的對(duì)話框中會(huì)看到手形,如下圖所示:
- 選擇Maven Project,請(qǐng)選中Create a simple project(skip archetype selection),之后點(diǎn)擊Next悯恍;
-
選擇”maven-archetype-webapp";
填寫Group id和Artifact id库糠, Version默認(rèn),Packaging默認(rèn)為jar,Name坪稽,Description選填曼玩,其他的不填(這里我已經(jīng)創(chuàng)建過(guò)該項(xiàng)目了,所以會(huì)提示already exists) 窒百。
-
創(chuàng)建好項(xiàng)目后黍判,目錄如下:
- 至此,項(xiàng)目已經(jīng)創(chuàng)建完畢篙梢,下邊開始配置顷帖;
-
添加Source Folder:
Maven規(guī)定,必須創(chuàng)建以下幾個(gè)Source Folder
src/main/resources
src/main/java
src/test/resources
src/test/java
添加以上的Source Folder(如果已經(jīng)存在,可忽略此步驟)贬墩,添加完后榴嗅,如下圖所示:
-
配置Build Path;
設(shè)定4個(gè)文件夾的輸出Output folder陶舞,雙擊修改:
分別修改輸出路徑為
src/main/resources 對(duì)應(yīng) target/classes
src/main/java 對(duì)應(yīng) target/classes
src/test/resources 對(duì)應(yīng) target/test-classes
src/test/java 對(duì)應(yīng) target/test-classes
修改后如下圖:
-
設(shè)定Libraries
- 完成,接下來(lái)就可以編寫自己的程序了嗽测。
3.2 Maven項(xiàng)目的目錄約定
3.3 pox.xml解讀
(1). modelVersion
指定了當(dāng)前Maven模型的版本號(hào),對(duì)于Maven2和Maven3來(lái)說(shuō)肿孵,它只能是4.0.0唠粥;
(2). groupId
顧名思義,這個(gè)應(yīng)該是公司名或是組織名停做。一般來(lái)說(shuō)groupId是由三個(gè)部分組成晤愧,每個(gè)部分之間以"."分隔,第一部分是項(xiàng)目用途蛉腌,比如用于商業(yè)的就是"com"官份,用于非營(yíng)利性組織的就是"org";第二部分是公司名烙丛,比如"tengxun"舅巷、"baidu"、"alibaba"蜀变;第三部分是你的項(xiàng)目名
(3). artifactId
可以認(rèn)為是Maven構(gòu)建的項(xiàng)目名悄谐,比如你的項(xiàng)目中有子項(xiàng)目介评,就可以使用"項(xiàng)目名-子項(xiàng)目名"的命名方式
(4). Version
版本號(hào)库北,SNAPSHOT意為快照,說(shuō)明該項(xiàng)目還在開發(fā)中们陆,是不穩(wěn)定的版本寒瓦。在Maven中很重要的一點(diǎn)是,groupId坪仇、artifactId杂腰、version三個(gè)元素生成了一個(gè)Maven項(xiàng)目的基本坐標(biāo),這非常重要椅文!
在上面的這些元素之外喂很,還有一些元素,同樣羅列一下:
- Packing
項(xiàng)目打包的類型皆刺,可以使jar少辣、war、rar羡蛾、ear漓帅、pom,默認(rèn)是jar; - dependencies和dependency
前者包含后者忙干。前面說(shuō)了器予,Maven的一個(gè)重要作用就是統(tǒng)一管理jar包,為了一個(gè)項(xiàng)目可以build或運(yùn)行捐迫,項(xiàng)目中不可避免的乾翔,會(huì)依賴很多其他的jar包,在Maven中施戴,這些依賴就被稱為dependency末融。
說(shuō)到這里,就有一個(gè)本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)的概念了暇韧。官方下載的本地倉(cāng)庫(kù)的配置在"%MAVEN_HOME%\conf\settings.xml"里面勾习,找一下"localRepository"就可以了(可以自己定義下載下來(lái)的jar包的存放位置,見https://www.cnblogs.com/xdp-gacl/p/3498271.html )懈玻;MyEclipse默認(rèn)的本地倉(cāng)庫(kù)的地址在"{user.home}/.m2/repository"路徑下巧婶,同樣找一下"localRepository"就可以找到MyEclipse默認(rèn)的本地倉(cāng)庫(kù)了。
本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)是這樣的涂乌,Maven工程首先會(huì)從本地倉(cāng)庫(kù)中獲取jar包艺栈,當(dāng)無(wú)法獲取指定jar包時(shí),本地倉(cāng)庫(kù)會(huì)從遠(yuǎn)程倉(cāng)庫(kù)(中央倉(cāng)庫(kù))中下載jar包湾盒,并放入本地倉(cāng)庫(kù)以備將來(lái)使用湿右。
舉個(gè)例子,比方說(shuō)我的項(xiàng)目中用到了MyBatis罚勾,那么可以這么配置:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.5</version>
</dependency>
</dependencies>
之前有說(shuō)過(guò)groupId毅人、artifactId、version唯一標(biāo)識(shí)一個(gè)Maven項(xiàng)目尖殃,有了這三個(gè)元素丈莺,我們就可以去遠(yuǎn)程倉(cāng)庫(kù)下載MyBatis3.2.5.jar到本地倉(cāng)庫(kù)了∷头幔回想我們之前的做法缔俄,如果要MyBatis的jar包,發(fā)現(xiàn)沒有器躏,然后去網(wǎng)上下載一個(gè),需要另外的jar包登失,然后去網(wǎng)上下載一個(gè),但是有了Maven壁畸,就方便多了贼急,只需要配置jar包對(duì)應(yīng)的dependency依賴碴倾,Maven會(huì)自動(dòng)幫助我們?nèi)ミh(yuǎn)程倉(cāng)庫(kù)中下載jar包到本地倉(cāng)庫(kù)中僧须。
- properties
properties是用來(lái)定義一些配置屬性的,例如project.build.sourceEncoding(項(xiàng)目構(gòu)建源碼編碼方式)闻蛀,可以設(shè)置為UTF-8泽篮,防止中文亂碼,也可定義相關(guān)構(gòu)建版本號(hào)柑船,便于日后統(tǒng)一升級(jí)帽撑。 - build
build表示與構(gòu)建相關(guān)的配置,比如build下有finalName鞍时,表示的就是最終構(gòu)建之后的名稱亏拉。
3.4添加本地jar包
-
首先我在項(xiàng)目根目錄中創(chuàng)建一個(gè)lib文件夾扣蜻,將jar包拷貝到lib文件夾下:
- 然后我們?cè)趍aven的pom.xml中配置:
<dependency>
<groupId>com.localjar.jar1</groupId>
<artifactId>jar1</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/hadoop-ext.jar
</systemPath>
</dependency>
<dependency>
<groupId>com.localjar.jar2</groupId>
<artifactId>jar2</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/mr.proj.jar
</systemPath>
</dependency>
這里的groupId和artifactId以及version都是可以隨便填寫的 ,scope必須填寫為system及塘,而systemPath寫現(xiàn)在我們jar包的地址就可以了莽使;
3.5 添加外部jar包
- 去mvnrepository 官網(wǎng) http://mvnrepository.com/ 查找需要的jar包,復(fù)制dependency代碼到pom.xml中即可笙僚。
例如想查找org.apache.commons.lang.StringUtils芳肌,可以輸入commons,
點(diǎn)一個(gè)適合的版本肋层,例如我選2.6:
把代碼拷貝到pom的<dependencies></ dependencies >中即可亿笤。
4. Maven入門使用常見問(wèn)題
說(shuō)明:這些問(wèn)題有的是從網(wǎng)上找的,有的是我自己遇到的栋猖,能否解決您的問(wèn)題視情況而定净薛,具體問(wèn)題還要具體分析,不行就找度娘哈蒲拉。
-
我從SVN上下載了一個(gè)以Maven構(gòu)建的工程罕拂,下載完畢沒有jar包怎么辦?
從資源庫(kù)上下載下來(lái)的Maven工程全陨,是沒有jar包的爆班,此時(shí)可以這么做:
(1)刪除Maven工程,但是刪除的時(shí)候不要?jiǎng)h除本地工程里面的Maven工程辱姨,只刪除MyEclipse中的Maven工程
(2)右鍵Import->Maven4MyEclipse->Existing Maven Projects柿菩,導(dǎo)入你的Maven工程,此時(shí)MyEclipse在構(gòu)建工程的時(shí)候雨涛,假如你的本地倉(cāng)庫(kù)中沒有dependcy中的jar包枢舶,便會(huì)去遠(yuǎn)程倉(cāng)庫(kù)下載jar包到本地倉(cāng)庫(kù)中。你的工程導(dǎo)入完畢之后替久,Library應(yīng)該是這樣的:
- 重新下載Maven工程所依賴的jar包凉泄、導(dǎo)入jar包都需要觸發(fā)Maven工程的build workspace,那么如何才能觸發(fā)Maven工程的build workspace蚯根?
找到一個(gè)pom.xml后众,隨便修改一下,加一個(gè)空格颅拦、減一個(gè)空格什么的蒂誉,ctrl+s保存一下,便會(huì)觸發(fā)Maven工程的build workspace了 - 本地倉(cāng)庫(kù)的目錄結(jié)構(gòu)是什么樣子的距帅?
groupId右锨、artifactId、version確定一個(gè)唯一的Maven碌秸,比方說(shuō)我有一個(gè)mybatis的dependcy:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.5</version>
</dependency>
那么mybatis的jar包應(yīng)該在%Maven倉(cāng)庫(kù)地址%\org\mybatis\mybatis\3.2.5\這一路徑下绍移,看到了吧悄窃,先groupId,再mybatis蹂窖,最后version轧抗,每個(gè)名字都是一個(gè)文件夾的名字 - 有些jar包在dependcy里面有配置,Import了Maven工程恼策,下載完工程所依賴的jar包之后鸦致,發(fā)現(xiàn)本地倉(cāng)庫(kù)里面卻沒有,怎么辦涣楷?
可能是原先下載jar包的時(shí)候出了什么問(wèn)題分唾,從artifactId目錄開始刪除以下的所有文件/文件夾,然后觸發(fā)一次Maven工程的build workspace就可以了 - 本地倉(cāng)庫(kù)中確定已經(jīng)有jar包了狮斗,工程里面卻報(bào)錯(cuò)绽乔,說(shuō)找不到j(luò)ar包,該怎么辦碳褒?
應(yīng)該有很多解決辦法折砸,目前解決的一種辦法是,MyEclipse->Window->Preferences->搜索Maven->User Settings,Update Settings和Reindex點(diǎn)一下就好了沙峻。另外睦授,可以嘗試一下把本地Maven倉(cāng)庫(kù)內(nèi)的jar包刪除一下,然后重新build workspace摔寨,可能也可以去枷。 - 項(xiàng)目上有紅叉提示錯(cuò)誤,但是整個(gè)項(xiàng)目沒有任何文件有錯(cuò)是复,怎么辦删顶?
解決辦法就是:
右鍵項(xiàng)目,【Maven】--》【Update Project Configuration...】即可淑廊。 - Maven構(gòu)建項(xiàng)目后項(xiàng)目報(bào)Error錯(cuò)誤Java compiler level does not match the version of the installed Java project facet逗余。
項(xiàng)目->右鍵->Project Facets->修改facets中java版本(下拉箭頭出)為要用的版本
Maven構(gòu)建項(xiàng)目需注意
1.項(xiàng)目右鍵->Preferences->buildpath->jdk版本
2.項(xiàng)目右鍵->Preferences->javacompiler->jdk版本
3.項(xiàng)目右鍵->Preferences->ProjectFacets->jdk版本
先講這些哈,如有錯(cuò)誤季惩,歡迎指正录粱。
喜歡別忘點(diǎn)個(gè)攢哈,筆芯~