天天看點

maven學習(上)- 基本入門用法

一、下載下傳及安裝

1.1 下載下傳maven 3.1.1

2.1 配置環境變量

系統環境變量裡,添加MAVEN_HOME(或M2_HOME),其值為C:\Java\maven-3.1.1,然後PATH環境變量最後附加上";%MAVEN_HOME%\bin"

檢測方法:

a) 重新進入指令行(DOS視窗)模式,輸入 echo %MAVEN_HOME% 如果能顯示 C:\Java\maven-3.1.1 說明環境變量起作用了

b) 輸入 mvn -version,正常情況下會顯示maven及jdk的版本号

(前提:jdk環境必須先安裝好,否則後面無法正常編譯項目)

3 了解“倉庫”

首次運作完mvn -version後,會在使用者目錄下建立一個.m2的目錄(比如:C:\Users\目前使用者名\.m2\),這個目錄是maven的“本地倉庫”,倉庫是maven中一個很重要的概念。

試想一下,我們會在工作中同時建立很多項目,每個項目可能都會引用一些公用的jar包(.NET中是dll檔案),一種作法是每個項目裡,都複制一份這些依賴的jar包(或dll檔案),這樣顯然不好,相同的檔案在硬碟上儲存了多份,太占用空間,而且這些依賴的jar包(或dll檔案)的版本也不太好管理(比如某個公用的jar包,從1.0更新到2.0,如果所有引用這個jar包的項目都需要更新,必須一個個項目的修改)。

maven的倉庫則很好的解決了這些問題,它在每台機器上建立一個本機倉庫,把本機上所有maven項目依賴的jar包統一管理起來,而且這些jar包用“坐标”來唯一辨別(注:坐标是另一個重要的概念,後面還會講到,這裡隻要簡單了解成“唯一識别某個jar封包件名、版本号”的辨別即可),這樣所有maven項目就不需要再象以前那樣把jar包複制到lib目錄中,整個maven項目看起來十厘清爽。

4 配置代理伺服器(可選)

maven項目在編譯、測試、打包裡,會需要從maven的中央倉庫(即:maven組織公布在網際網路上的一個站點,裡面已經收錄了目前絕大多數主流的jar包)下載下傳jar包等檔案,如果使用代理伺服器上網,需要配置代理伺服器。

把%MAVEN_HOME%\conf\settings.xml複制一份到本地倉庫C:\Users\目前使用者名\.m2\下,然後編輯該檔案,找到下面這段

把注釋去掉,host這裡填寫代理伺服器的位址(可以用IP)以及port端口,如果需要使用者名/密碼認證,則填寫username/password節點,否則username/password這二個節點去掉,nonProxyHosts表示某些位址不需要經過代理伺服器,多個位址之間用|分隔,支援通配符,比如172.156.* 

二、建立項目“骨架”

下面用命名行建立一個最基本的maven項目

2.1 mvn archetype:generate

先建立項目的根目錄,比如c:\test,指令行視窗下輸入

cd /d c:\test

mvn archetype:generate

首次運作時,mvn會從遠端"中央倉庫"下載下傳一些必需的檔案到"本地倉庫" - (如果你有興趣,可以在等待下載下傳過程中,觀察一下"C:\Users\目前使用者名\.m2\repository"到底下載下傳了些啥東東)

下載下傳完成後(下一篇會講解如何,在區域網路環境中搭建“私服”,直接從區域網路的代理倉庫中下載下傳這些依賴項),會自動進入互動模式,會讓你輸入一些基本資訊,類似下面這樣:

...

[INFO] Generating project in Interactive mode (這裡會卡一會兒,因為要聯網擷取項目模闆)

[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)

... (這裡會自動列出很多項目模闆,每種模闆前面會有一個數字序号)

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: (這裡根據每個人機器上安裝的eclipse插件不同,可能預設的數字不是這個,先不管,直接回車)

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: (直接回車)

Define value for property 'groupId': : cnblogs (可暫時先了解成類似package或namespace的名稱,通常我們填寫組織機構名稱縮寫)

Define value for property 'artifactId': : maven-hello-world (元件名稱,可暫時了解成項目名稱)

Define value for property 'version':  1.0-SNAPSHOT: : (版本号,直接回車,預設1.0-SNAPSHOT)

Define value for property 'package':  cnblogs: : (打包後的jar檔案名,相當于.net中項目最後生成的程式集dll名稱)

Confirm properties configuration:

groupId: cnblogs

artifactId: maven-hello-world

version: 1.0-SNAPSHOT

package: cnblogs

 Y: :  (直接回車确認)

[INFO] ----------------------------------------------------------------------------

[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1

[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 (看到這個,表示項目建立成功!)

2.2 maven項目的目錄結構

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項目采用“約定優于配置”的原則,src/main/java約定用于存放源代碼,src/main/test用于存放單元測試代碼,src/target用于存放編譯、打包後的輸出檔案。這是全世界maven項目的通用約定,請記住這些固定的目錄結構。

三、編譯項目

先進入剛才建立項目的根目錄

cd /d c:\test\maven-hello-world

然後執行 mvn clean compile

這樣就能對項目進行編譯了,編譯後會自動在target目錄中生成class檔案,如果編譯成功,會輸出類似下面的資訊

yangjunmingmatoMacBook-Pro-7:maven-hello-world jimmy$ mvn clean compile

[INFO] Scanning for projects...

[INFO]                                                                         

[INFO] Building maven-hello-world 1.0-SNAPSHOT

[INFO]

[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-hello-world ---

[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] --- 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] BUILD SUCCESS

[INFO] Total time: 1.515s

[INFO] Finished at: Wed Jan 01 19:08:32 CST 2014

[INFO] Final Memory: 10M/156M

四、單元測試

mvn clean test

這樣就能做單元測試了,so easy !

如果單元測試不通過,會提示出錯資訊,注意看輸出。

注:從輸出上可以發現,test前,會先執行compile,即先編譯,再執行單元測試.

有興趣的朋友,可以修改下/src/test/java/cnblogs/AppTest.java裡的内容,把testApp()方法中的assertTrue( true );改成assertTrue( false );再跑下單元測試,看下有什麼不同

五、項目打包

通常我們會把java項目打包成jar包或war包,maven中打包的指令為

mvn clean package

運作完後,會在target目錄下生成jar包

注:從輸出 可以發現,package前,會先執行compile,再執行test,最後才是package打包

六、項目運作

該項目中的App.java中有main方法,可以直接運作,正常方式下,我們如果想直接運作class檔案,得敲一段很長的指令,maven中不必這麼複雜,先用記事本打開項目根目錄下的pom.xml檔案,增加下面這節内容:

maven學習(上)- 基本入門用法
maven學習(上)- 基本入門用法

View Code

上述這段内容插入在</project>之前即可。

然後在指令行下,輸入

mvn exec:exec

即可直接運作,下面是輸出:

C:\test\maven-hello-world>mvn exec:exec

[INFO] --- exec-maven-plugin:1.2.1:exec (default-cli) @ maven-hello-world ---

Hello World!

[INFO] Total time: 1.175s

[INFO] Finished at: Mon Jan 13 22:35:02 CST 2014

[INFO] Final Memory: 6M/111M

七、項目部署

如果是web項目,使用指令

mvn clean jboss-as:deploy

就能自動将web項目部署到jboss中(前提是jboss web server已經成功啟動),因為剛才我們建立的是一個最基本的maven項目,并非web項目,是以執行這條指令,應該會失敗,後面會講如何在eclipse中用插件部署web項目,這裡可以先跳過。

另外:

有時候,我們的項目是一個類庫,隻是封裝一些方法供其它項目引用,對于這種項目,我們可以用 mvn clean install 把生成的jar包,安裝到“本地倉庫”中,這樣本機其它項目需要使用該jar包時,隻要在pom裡配置依賴項即可,不用把jar包複制到目前項目中。

八、eclipse中內建maven

8.1 修改eclipse中使用的maven版本

eclipse自帶了maven3.0.4,如果想使用最新的3.1.1,可以在eclipse -> window -> perferences -> Maven -> Installations 裡參考下圖設定一下

maven學習(上)- 基本入門用法

8.2 安裝Red Hat JBoss Developer Studio(可選,純個人喜歡)

eclipse -> help -> Eclipse Marketplace 搜尋jboss,找到Red Hat JBoss Developer Studio,安裝即可

maven學習(上)- 基本入門用法

8.3 建立一個web的maven示例項目

File -> New -> Maven Project -> Next ,在接下來的視窗中會看到一大堆的項目模闆,Filter欄裡輸入“jboss-javaee6-webapp-archetype”,參考下圖

maven學習(上)- 基本入門用法

然後Next,在接下來的界面中填寫groupId之類

maven學習(上)- 基本入門用法

然後Finish完成項目建立。整個過程其實跟前面提到的純手式指令行完全類似,隻不過借助于插件,以圖形化的方式更友好而已,直接Finish

maven學習(上)- 基本入門用法

項目上右擊->Run As 就能看到很多Maven的選項,顧名思義,如何選擇Maven install,等效于指令行執行mvn clean install,其它幾項的含義一看便知,一般來講Maven test 和 Maven install這二個基本上已經夠用,如果還想定義自己的指令,比如 maven clean package,可以選擇“6 Maven build...”,會彈出一個界面,如下圖,在name輸入框填寫名稱:maven-web-sample-package(名字可以随便寫,隻要友善自己記憶就行),Goals欄輸入clean package

maven學習(上)- 基本入門用法

最後點選Run關閉這個視窗,以後可以直接從工具欄調出這個選擇,如下圖:

maven學習(上)- 基本入門用法

實際使用中,發現eclipse與maven之間并非整合得天衣無縫,有時候eclipse中項目圖示經常會莫名其妙的出現一些紅叉,以下是一些個人經驗:

a) 嘗試先到Dos指令行視窗,用mvn clean compile(或install)之類的指令試下能否正常編譯

b) 如果a) 步驟能正常編譯,在回到eclipse中,項目右擊->Maven-Update Project ,通常這樣就能消除紅叉

c) 有時候b)步驟操作完以後,仍然會有紅色感歎号或紅叉,但是eclipse編譯、調試都OK,這就要具體問題具體分析了,可以嘗試把Problems面闆調出來,逐個分析

d) 以上3個步驟都嘗試無效後,最後還可以嘗試 Windows -> Preferences -> Validation -> Disable All 把所有驗證都關掉

繼續閱讀