轉(zhuǎn)自: https://www.cnblogs.com/yjmyzz/p/3495762.html
一双絮、下載及安裝
1.1 下載maven 3.6.2
先到官網(wǎng)http://maven.apache.org/download.cgi 下載最新版本(目前是3.6.2 ),下載完成后埃元,解壓到某個(gè)目錄(本文中是C:\Java\maven-3.6.2)
2.1 配置環(huán)境變量
系統(tǒng)環(huán)境變量里勾给,添加MAVEN_HOME(或M2_HOME)饰及,其值為C:\Java\maven-3.6.2右蕊,然后PATH環(huán)境變量最后附加上";%MAVEN_HOME%\bin"
檢測(cè)方法:
a) 重新進(jìn)入命令行(DOS窗口)模式,輸入 echo %MAVEN_HOME% 如果能顯示 C:\Java\maven-3.6.2 說(shuō)明環(huán)境變量起作用了
b) 輸入 mvn -version,正常情況下會(huì)顯示maven及jdk的版本號(hào)
(前提:jdk環(huán)境必須先安裝好,否則后面無(wú)法正常編譯項(xiàng)目)
3 理解“倉(cāng)庫(kù)”
首次運(yùn)行完mvn -version后湾笛,會(huì)在用戶(hù)目錄下創(chuàng)建一個(gè).m2的目錄(比如:C:\Users\當(dāng)前用戶(hù)名.m2)平夜,這個(gè)目錄是maven的“本地倉(cāng)庫(kù)”,倉(cāng)庫(kù)是maven中一個(gè)很重要的概念。
試想一下,我們會(huì)在工作中同時(shí)創(chuàng)建很多項(xiàng)目,每個(gè)項(xiàng)目可能都會(huì)引用一些公用的jar包(.NET中是dll文件)潦匈,一種作法是每個(gè)項(xiàng)目里,都復(fù)制一份這些依賴(lài)的jar包(或dll文件)赚导,這樣顯然不好茬缩,相同的文件在硬盤(pán)上保存了多份,太占用空間吼旧,而且這些依賴(lài)的jar包(或dll文件)的版本也不太好管理(比如某個(gè)公用的jar包凰锡,從1.0升級(jí)到2.0,如果所有引用這個(gè)jar包的項(xiàng)目都需要更新圈暗,必須一個(gè)個(gè)項(xiàng)目的修改)掂为。
maven的倉(cāng)庫(kù)則很好的解決了這些問(wèn)題,它在每臺(tái)機(jī)器上創(chuàng)建一個(gè)本機(jī)倉(cāng)庫(kù)员串,把本機(jī)上所有maven項(xiàng)目依賴(lài)的jar包統(tǒng)一管理起來(lái)勇哗,而且這些jar包用“坐標(biāo)”來(lái)唯一標(biāo)識(shí)(注:坐標(biāo)是另一個(gè)重要的概念,后面還會(huì)講到寸齐,這里只要簡(jiǎn)單理解成“唯一識(shí)別某個(gè)jar包文件名欲诺、版本號(hào)”的標(biāo)識(shí)即可)抄谐,這樣所有maven項(xiàng)目就不需要再象以前那樣把jar包復(fù)制到lib目錄中,整個(gè)maven項(xiàng)目看起來(lái)十分清爽扰法。
4 配置代理服務(wù)器(可選)
maven項(xiàng)目在編譯蛹含、測(cè)試、打包里塞颁,會(huì)需要從maven的中央倉(cāng)庫(kù)(即:maven組織公布在互聯(lián)網(wǎng)上的一個(gè)站點(diǎn)浦箱,里面已經(jīng)收錄了目前絕大多數(shù)主流的jar包)下載jar包等文件,如果使用代理服務(wù)器上網(wǎng)祠锣,需要配置代理服務(wù)器酷窥。
把%MAVEN_HOME%\conf\settings.xml復(fù)制一份到本地倉(cāng)庫(kù)C:\Users\當(dāng)前用戶(hù)名.m2\下,然后編輯該文件锤岸,找到下面這段
<proxies>
<!-- proxy
| Specification for one proxy, to be used in connecting to the network.
|
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
</proxies>
把注釋去掉竖幔,host這里填寫(xiě)代理服務(wù)器的地址(可以用IP)以及port端口,如果需要用戶(hù)名/密碼認(rèn)證是偷,則填寫(xiě)username/password節(jié)點(diǎn),否則username/password這二個(gè)節(jié)點(diǎn)去掉募逞,nonProxyHosts表示某些地址不需要經(jīng)過(guò)代理服務(wù)器蛋铆,多個(gè)地址之間用|分隔,支持通配符放接,比如172.156.*
二刺啦、創(chuàng)建項(xiàng)目“骨架”
下面用命名行創(chuàng)建一個(gè)最基本的maven項(xiàng)目
2.1 mvn archetype:generate
先創(chuàng)建項(xiàng)目的根目錄,比如c:\test纠脾,命令行窗口下輸入
cd /d c:\test
mvn archetype:generate
首次運(yùn)行時(shí)玛瘸,mvn會(huì)從遠(yuǎn)程"中央倉(cāng)庫(kù)"下載一些必需的文件到"本地倉(cāng)庫(kù)" - (如果你有興趣,可以在等待下載過(guò)程中苟蹈,觀(guān)察一下"C:\Users\當(dāng)前用戶(hù)名.m2\repository"到底下載了些啥東東)
下載完成后(下一篇會(huì)講解如何糊渊,在局域網(wǎng)環(huán)境中搭建“私服”,直接從局域網(wǎng)的代理倉(cāng)庫(kù)中下載這些依賴(lài)項(xiàng))慧脱,會(huì)自動(dòng)進(jìn)入交互模式渺绒,會(huì)讓你輸入一些基本信息,類(lèi)似下面這樣:
...
[INFO] Generating project in Interactive mode(這里會(huì)卡一會(huì)兒菱鸥,因?yàn)橐?lián)網(wǎng)獲取項(xiàng)目模板)
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> br.com.ingenieux:elasticbeanstalk-service-webapp-archetype (A Maven Archetype Encompassing RestAssured, Jetty, Jackson, Guice and Jersey for Publishing JAX-RS-based Services on AWS' Elastic Beanstalk Service)
... (這里會(huì)自動(dòng)列出很多項(xiàng)目模板宗兼,每種模板前面會(huì)有一個(gè)數(shù)字序號(hào))
336: remote -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)
...
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 336: (這里根據(jù)每個(gè)人機(jī)器上安裝的eclipse插件不同,可能默認(rèn)的數(shù)字不是這個(gè)氮采,先不管殷绍,直接回車(chē))
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: (直接回車(chē))
Define value for property 'groupId': : cnblogs <(可暫時(shí)先理解成類(lèi)似package或namespace的名稱(chēng),通常我們填寫(xiě)組織機(jī)構(gòu)名稱(chēng)縮寫(xiě))
Define value for property 'artifactId': : maven-hello-world (組件名稱(chēng)鹊漠,可暫時(shí)理解成項(xiàng)目名稱(chēng))
Define value for property 'version': 1.0-SNAPSHOT: : (版本號(hào)主到,直接回車(chē)殖侵,默認(rèn)1.0-SNAPSHOT)
Define value for property 'package': cnblogs: : (打包后的jar文件名,相當(dāng)于.net中項(xiàng)目最后生成的程序集dll名稱(chēng))
Confirm properties configuration:
groupId: cnblogs
artifactId: maven-hello-world
version: 1.0-SNAPSHOT
package: cnblogs
- Y: :
(直接回車(chē)確認(rèn))
*
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: cnblogs
[INFO] Parameter: packageName, Value: cnblogs
[INFO] Parameter: package, Value: cnblogs
[INFO] Parameter: artifactId, Value: maven-hello-world
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS(看到這個(gè)镰烧,表示項(xiàng)目創(chuàng)建成功拢军!)
[INFO] ------------------------------------------------------------------------
...
2.2 maven項(xiàng)目的目錄結(jié)構(gòu)
C:\test\maven-hello-world>tree
Folder PATH listing for volume win7
Volume serial number is AA2C-6E70
C:.
├───src
│ ├───main
│ │ └───java
│ │ └───cnblogs
│ └───test
│ └───java
│ └───cnblogs
└───target
└───classes
└───cnblogs
注意上面帶紅色的目錄名,maven項(xiàng)目采用“約定優(yōu)于配置”的原則怔鳖,src/main/java約定用于存放源代碼茉唉,src/main/test用于存放單元測(cè)試代碼,src/target用于存放編譯结执、打包后的輸出文件度陆。這是全世界maven項(xiàng)目的通用約定,請(qǐng)記住這些固定的目錄結(jié)構(gòu)献幔。
三懂傀、編譯項(xiàng)目
先進(jìn)入剛才創(chuàng)建項(xiàng)目的根目錄
cd /d c:\test\maven-hello-world
然后執(zhí)行 mvn clean compile
這樣就能對(duì)項(xiàng)目進(jìn)行編譯了,編譯后會(huì)自動(dòng)在target目錄中生成class文件蜡感,如果編譯成功蹬蚁,會(huì)輸出類(lèi)似下面的信息
yangjunmingmatoMacBook-Pro-7:maven-hello-world jimmy$ mvn clean compile
[INFO] Scanning for projects...
*[INFO] *
[INFO] ------------------------------------------------------------------------
[INFO] Building maven-hello-world 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-hello-world ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-hello-world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/jimmy/Desktop/study/maven-hello-world/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ maven-hello-world ---
[INFO] Compiling 1 source file to /Users/jimmy/Desktop/study/maven-hello-world/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.515s
[INFO] Finished at: Wed Jan 01 19:08:32 CST 2014
[INFO] Final Memory: 10M/156M
[INFO] ------------------------------------------------------------------------
*如果編譯提示JAVA版本過(guò)低異常時(shí),用記事本打開(kāi)項(xiàng)目根目錄下的pom.xml文件郑兴,增加下面這節(jié)內(nèi)容:
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
<java.version>11</java.version>
上述這段內(nèi)容插入在</properties>之前即可犀斋。JAVA版本號(hào)可以任意指定為1.6以上版本。
四情连、單元測(cè)試
mvn clean test
這樣就能做單元測(cè)試了叽粹,so easy !
如果單元測(cè)試不通過(guò),會(huì)提示出錯(cuò)信息却舀,注意看輸出虫几。
注:從輸出上可以發(fā)現(xiàn),test前挽拔,會(huì)先執(zhí)行compile辆脸,即先編譯,再執(zhí)行單元測(cè)試.
有興趣的朋友篱昔,可以修改下/src/test/java/cnblogs/AppTest.java里的內(nèi)容每强,把testApp()方法中的assertTrue( true );改成assertTrue( false );再跑下單元測(cè)試,看下有什么不同
五州刽、項(xiàng)目打包
通常我們會(huì)把java項(xiàng)目打包成jar包或war包空执,maven中打包的命令為
mvn clean package
運(yùn)行完后,會(huì)在target目錄下生成jar包
注:從輸出 可以發(fā)現(xiàn)穗椅,package前辨绊,會(huì)先執(zhí)行compile,再執(zhí)行test匹表,最后才是package打包
六门坷、項(xiàng)目運(yùn)行
該項(xiàng)目中的App.java中有main方法宣鄙,可以直接運(yùn)行,常規(guī)方式下默蚌,我們?nèi)绻胫苯舆\(yùn)行class文件冻晤,得敲一段很長(zhǎng)的命令,maven中不必這么復(fù)雜绸吸,先用記事本打開(kāi)項(xiàng)目根目錄下的pom.xml文件鼻弧,增加下面這節(jié)內(nèi)容:
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath>
</classpath>
<argument>cnblogs.App</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
上述這段內(nèi)容插入在</project>之前即可。
然后在命令行下锦茁,輸入
mvn exec:exec
即可直接運(yùn)行攘轩,下面是輸出:
C:\test\maven-hello-world>mvn exec:exec
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building maven-hello-world 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.2.1:exec (default-cli) @ maven-hello-world ---
Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.175s
[INFO] Finished at: Mon Jan 13 22:35:02 CST 2014
[INFO] Final Memory: 6M/111M
[INFO] ------------------------------------------------------------------------
七、項(xiàng)目部署
如果是web項(xiàng)目码俩,使用命令
mvn clean jboss-as:deploy
就能自動(dòng)將web項(xiàng)目部署到j(luò)boss中(前提是jboss web server已經(jīng)成功啟動(dòng))度帮,因?yàn)閯偛盼覀儎?chuàng)建的是一個(gè)最基本的maven項(xiàng)目,并非web項(xiàng)目稿存,所以執(zhí)行這條命令笨篷,應(yīng)該會(huì)失敗,后面會(huì)講如何在eclipse中用插件部署web項(xiàng)目挠铲,這里可以先跳過(guò)冕屯。
另外:
有時(shí)候,我們的項(xiàng)目是一個(gè)類(lèi)庫(kù)拂苹,只是封裝一些方法供其它項(xiàng)目引用,對(duì)于這種項(xiàng)目痰洒,我們可以用 mvn clean install 把生成的jar包瓢棒,安裝到“本地倉(cāng)庫(kù)”中,這樣本機(jī)其它項(xiàng)目需要使用該jar包時(shí)丘喻,只要在pom里配置依賴(lài)項(xiàng)即可脯宿,不用把jar包復(fù)制到當(dāng)前項(xiàng)目中。
八泉粉、eclipse中集成maven
8.1 修改eclipse中使用的maven版本
eclipse自帶了maven3.0.4连霉,如果想使用3.1.1,可以在eclipse -> window -> perferences -> Maven -> Installations 里參考下圖設(shè)置一下
8.2 安裝Red Hat JBoss Developer Studio(可選嗡靡,純個(gè)人喜歡)
eclipse -> help -> Eclipse Marketplace 搜索jboss跺撼,找到Red Hat JBoss Developer Studio,安裝即可
8.3 創(chuàng)建一個(gè)web的maven示例項(xiàng)目
File -> New -> Maven Project -> Next ,在接下來(lái)的窗口中會(huì)看到一大堆的項(xiàng)目模板讨彼,F(xiàn)ilter欄里輸入“jboss-javaee6-webapp-archetype”,參考下圖
然后Next歉井,在接下來(lái)的界面中填寫(xiě)groupId之類(lèi)
然后Finish完成項(xiàng)目創(chuàng)建。整個(gè)過(guò)程其實(shí)跟前面提到的純手式命令行完全類(lèi)似哈误,只不過(guò)借助于插件哩至,以圖形化的方式更友好而已躏嚎,直接Finish
項(xiàng)目上右擊->Run As 就能看到很多Maven的選項(xiàng),顧名思義菩貌,如何選擇Maven install卢佣,等效于命令行執(zhí)行mvn clean install,其它幾項(xiàng)的含義一看便知箭阶,一般來(lái)講Maven test 和 Maven install這二個(gè)基本上已經(jīng)夠用虚茶,如果還想定義自己的命令,比如 maven clean package尾膊,可以選擇“6 Maven build...”媳危,會(huì)彈出一個(gè)界面,如下圖冈敛,在name輸入框填寫(xiě)名稱(chēng):maven-web-sample-package(名字可以隨便寫(xiě)待笑,只要方便自己記憶就行),Goals欄輸入clean package
最后點(diǎn)擊Run關(guān)閉這個(gè)窗口抓谴,以后可以直接從工具欄調(diào)出這個(gè)選擇暮蹂,如下圖:
實(shí)際使用中,發(fā)現(xiàn)eclipse與maven之間并非整合得天衣無(wú)縫癌压,有時(shí)候eclipse中項(xiàng)目圖標(biāo)經(jīng)常會(huì)莫名其妙的出現(xiàn)一些紅叉仰泻,以下是一些個(gè)人經(jīng)驗(yàn):
a) 嘗試先到Dos命令行窗口,用mvn clean compile(或install)之類(lèi)的命令試下能否正常編譯
b) 如果a) 步驟能正常編譯滩届,在回到eclipse中集侯,項(xiàng)目右擊->Maven-Update Project ,通常這樣就能消除紅叉
c) 有時(shí)候b)步驟操作完以后帜消,仍然會(huì)有紅色感嘆號(hào)或紅叉棠枉,但是eclipse編譯、調(diào)試都OK泡挺,這就要具體問(wèn)題具體分析了辈讶,可以嘗試把Problems面板調(diào)出來(lái),逐個(gè)分析
d) 以上3個(gè)步驟都嘗試無(wú)效后娄猫,最后還可以嘗試 Windows -> Preferences -> Validation -> Disable All 把所有驗(yàn)證都關(guān)掉