項目管理利器maven學習總結

         相信很多小白和我一樣,做一個SSH框架的項目之前,首先到各自的官網下載框架jar包,有用的沒用的都拷到lib目錄下,衝突不衝突,運行了再說,呀!控制檯報錯了,又百度這個錯誤信息來自哪幾個jar包缺失或衝突,解決了這個錯誤,又出現了另一個錯誤,於是又百度....如此循環下去,項目還沒正式開動,光是jar包的整合就已經讓我們感受到了這個世界深深的惡意,還好開源世界的大神們爲我們提供了maven這種優秀的項目管理和構建工具。

Maven介紹

Maven是基於項目對象模型(POM),可以通過一小段描述信息來管理項目的構建、報告和文檔的軟件項目管理工具。

Maven環境搭建

首先到maven官網:maven.apache.org去下載maven,點擊左側欄目的Download進入下載頁面,再點擊Link是apache-maven-x.x.x-bin.zip的鏈接進行下載。
如下圖所示。

將下載好的壓縮包進行解壓,我們會發現裏邊包含了四個文件夾bin,boot,conf,lib。

       bin目錄包含了mvn的運行腳本,在windows的命令行中輸入mvn就會調用這些腳本,其中m2.conf是配置文件。

       boot目錄包含一個類加載器的框架,maven使用它來加載自己的類庫。

       conf是配置文件目錄。settings.xml經常用到。

       lib目錄下包含了maven使用時用到的所有的類庫,除了maven自身的,還包含了第三方的依賴的類庫。

環境變量的配置:

   新建一個M2_HOME系統變量,讓它指向你安裝的maven路徑

    再編輯path環境變量,


    打開cmd進行驗證配置是否成功:

    輸入mvn -v,若能出現maven版本號,java版本號以及一些系統信息,則說明maven配置成功

      



Maven項目目錄結構

src

-main(主代碼)

-java

-package(包名)

-test(測試代碼)

-java

-package(包名)

-resources(存放資源文件)

在Maven中提供了對包的新的管理方式,通過pom.xml配置文件來管理包引用。

pom.xml(存放在項目根目錄下,跟src同目錄):

<modelVersion>4.0.0</modelVersion>  modelVersion代表的是maven的版本,4.0.0是固定的。

<groupId></groupId>    groupId的值就是項目的包名。

<artifactId></artifactId>  artifactId的值是模塊名。

<version>0.0.1SNAPSHOT</version>

 

如果項目需要用到junit單元測試,就可以加入junit的依賴,即上圖<dependencies></dependencies>內的內容。

實例請看:http://www.07net01.com/2016/02/1276284.html ,以"Maven項目之HelloWorld"來說明如何純手工構建一個Maven項目.

 

Maven常用的構建命令(需要在cmd下到項目根目錄):

mvn  -v         查看maven版本

compile        編譯(當出現BUILD SUCCESS這個INFO,就說明項目編譯成功了,如果是第一次編譯,它會在命令運行之前下載很多的第三方插件和     maven所依賴的jar。

test               測試(若項目test無誤,則會在項目根目錄下生成一個target文件,其中classes文件下存放着編譯所生成的字節碼文件。surefire-                              reports下存放的是生成的測試報告。)

package       打包

clean            刪除target

Install           安裝jar包到本地倉庫

自動創建目錄骨架:

archetype插件用於創建符合maven規定的目錄骨架。

有兩種方式:

一、在cmd下項目根目錄下輸入mvn archetype:generate,按照提示進行選擇,他會幫我們自動創建好src和pom.xml。

二、mvn archetype:generate -DgroupId=組織名,公司網址的反寫+項目名

                       -DartifactId=項目名-模塊名

                         -Dversion=版本號

                         -Dpackage=代碼所存在的包

Maven中的座標和倉庫

在maven中任何一個依賴、插件、項目構建的輸出都可以被稱之爲構件,所有的構件均通過座標作爲其唯一的標識。(groupId、artifactId、version都可以組成項目基本的座標)
倉庫分爲本地倉庫遠程倉庫。若本地倉庫中找不到需要的構件,則它回去maven的全球的中央倉庫中查找,查找到之後,就會下載到我們的本地倉庫中供我們使用。若遠程的中央倉庫也找不到,就會報錯。
Maven默認提供了一個全球倉庫的地址,在maven的安裝文件下的lib目錄下找到maven-model-builder-x.x.x.jar,將其打開,找到
org/apache/maven/model/,找到pom.4.0.0.xml.所有的maven項目都會繼承這個pom。將其打開,

Url就是默認的全球中央倉庫,中央倉庫包含了絕大多數的開源的java項目,基本上平時做開發所用到的開源框架這裏都可以找得到。

鏡像倉庫:

由於maven中央倉庫的服務器都是位於國外的,有時因爲一些原因可能導致我們沒法訪問外網,不過好在國內也有它的鏡像倉庫,這樣就可以直接訪問國內的鏡像倉庫,相對來說會更快更穩定一些。

打開maven安裝文件下的conf文件,再編輯settings.xml,在146行找到mirrors標籤,拷貝它的事例,並進行修改。


更改本地倉庫的位置

本地倉庫的位置默認是放在當前的用戶目錄中


一般的話不會一把倉庫放在C盤,以防重裝系統等其他原因丟失,所以需要更改本地倉庫的位置。

在settings.xml中找到53行的localRepository標籤並拷貝出來進行修改。


再將 settings.xml拷貝一份到repo目錄中,這樣的話,以後如果更新maven的版本,就不必再次的修改settings.xml

在Myeclipse中創建maven項目

如果裝的是eclipse4.0及以上的版本或者是myeclipse,就不用再另外安裝maven插件,不確定的話可以在eclipse或者myeclipse的Window-Preferences查看是否有maven選項。

Myeclipse本身已經集成maven插件,所以簡單的配置下就好了。




配置完之後就可以新建maven項目了

在myeclipse中右鍵new-->other,在搜索框中搜索maven,然後選擇Maven Project點擊next再點擊next。


然後會有很多的目錄模板,選擇quickstart,再點擊next。


Finish之後打開剛剛創建的項目的pom.xml可以看到結構。

選中pom.xml右鍵Run As-->Maven build,可以輸入命令。

比如在Goal中輸入compile命令,再點擊Run。


可以看到編譯成功。

再輸入package命令,將其進行打包,打包成功後再查看項目的根目錄,可以看到它已經成功的編譯出了classes文件、測試報告以及jar文件。


Maven的生命週期和插件

完整的項目構建過程包括:清理、編譯、測試、打包、集成測試、驗證、部署。

Maven生命週期:

clean   清理項目

pre-clean  執行清理前的工作

clean     清理上一次構建生成的所有文件

post-clean  執行清理後的文件

default 構建項目(最核心)

compile test package install

site    生成項目站點

pre-site     在生成項目站點前要完成的工作

site        生成項目的站點文件

post-site    在生成項目站點後要完成的工作

site-deploy  發佈生成的站點到服務器上

三個生命週期是相互獨立的,每個生命週期都包含一些階段,各個生命週期中的階段卻是有順序的,且後面的階段依賴於前面的階段,執行某個階段時,其前面的階段會依次順序執行,但不會觸發另外兩套生命週期中的任何的階段。比如clean、compile、test、package、install。如果在運行package命令之前並沒有運行 complie和test命令,但運行package之後,complie和test是依次執行的。

在maven的官網中提供了很多的插件:


比如source插件可以把我們的項目源碼進行打包。

在pom.xml的project標籤下加入如下代碼。


然後右鍵Run As-->Maven build  Goals: clean package   運行了package之後可以在控制檯看到項目自動幫我們運行了編譯、測試及打包。

pom.xml常用元素介紹

<project></project>是pom.xml的根元素,他包含了pom的一些約束的信息。

<modelVersion>4.0.0</modelVersion>指定了當前pom的版本,也是一個必須的元素

座標的信息:

<groupId>反寫的公司網址+項目名</groupId>

<artifactId>項目名+模塊名</artifactId>

<!--第一個0 表示大版本號

       第二個0表示分支版本號

       第三個0表示小版本號

       0.0.1

       snapshot快照

       alpha內部測試

       beta公測

       Release穩當

       GA正式發佈

-->

<version></version>


<!--默認是jar

war zip pom

-->

<packaging></packaging>


<!--項目描述名-->

<name></name>


<!--項目地址-->

<url></url>


<!--項目描述-->

<desceiption></description>


<!--開發人員列表-->

<developers></developers>


<!--許可證的信息-->

<licenses></licenses>


<!--組織信息-->

<organization></organization>

 

<!--依賴列表-->

<dependencies>

<dependency>

<!--用座標確定依賴所在的位置-->

<groupId></groupId>

<artifactId></artifactId>

<version></version>

<type></type>

<scope>test</scope>

<!--設置依賴是否可選,默認是false,子項目默認是繼承的,

如果是true,子項目必須顯示的引用該依賴

-->

<optional></optional>

<!--排除依賴傳遞列表-->

<exclusions>

<exclusion>

</exclusion>

</exclusions>

</dependency>

</dependencies>


<!--依賴的管理,不會被引入到實際的依賴當中,這個標籤主要是用於定義在父模塊中,供子模塊繼承使用。比如在多個maven項目中都使用到了junit,name就可以抽象出一個父模塊,在父模塊中對junit進行定義,子模塊繼承父模塊就可以了

-->

<dependencyManagement>

<dependencies>

<dependency>

</dependency>

</dependencies>

</dependencyManagement>

 

<!--對構件的行爲提供相應的支持-->

<build>

<!--插件的列表-->

<plugins>

<plugin>

<groupId></groupId>

<artifactId></artifactId>

<version></version>

</plugin>

</plugins>

</build>

<!--通常用於在子模塊中對父模塊的pom的繼承-->

<parent></parent>


<!--用來聚合運行多個的maven項目-->

<modules>

<module></module>

</modules>

依賴範圍

我們平時在開發時,如果要使用某一個框架,就要將該框架的jar包引入到項目的classpath路徑中,這樣我們的項目就可以使用該框架爲我們封裝好的一些方法,maven中爲我們提供了三種classpath:

1、編譯

2、運行

3、測試

打開官方文檔

有6種scope的值:

complie:默認的範圍,編譯測試運行都有效

provided:在編譯和測試時都有效

runtime:在測試和運行時有效

test:只在測試時有效

system:編譯和測試時有效,與本機系統相關聯,可移植性差

import:導入的範圍,它只使用在dependencyManagement中,表示從其它的pom中導入dependency的配置

依賴傳遞

比如有三個maven項目,分別是hongxin-bge,hongxin-nage,hongxin-shanji。hongxin-nage依賴於hongxin-bge,首先在nage的pom.xml中加入bge的依賴。



再對bge的pom.xml進行打包,執行clean package,這樣本地倉庫中就會有bge的jar文件,不然對nage進行compile的時候會報錯。

同樣的shanji也依賴於nage,對shanji和nage進行上述相同的操作,shanji的maven依賴就會出現了nage和bge兩個依賴。這就是傳遞依賴。

要是想讓shanji只依賴於nage,那麼就用到了exclusions標籤。

保存之後就可以看到bge這個依賴已經被自動去除了。

依賴衝突

舉個例子,若A和B依賴了一個不同版本的相同的構件,那麼對於依賴於A和B的C來說,他究竟依賴的是A和B的哪一個版本的構件。

這裏有兩條原則:1、短路優先(優先解析路徑短的版本)

比如 A->B->C->X(jar)

A->D->X(jar)

則A會優先解析下面那個X的版本,畢竟短了一些嘛

      2、先聲明先優先(在路徑相同的情況下,則誰先聲明,先解析誰)

 

聚合和繼承

如果在maven中想把多個項目安裝到本地倉庫中,必須對其依次進行install。比如想安裝之前的bge、nage和shanji到本地倉庫,要分別對其的pom.xml進行install,三個項目還好,要是項目一多,就顯得很麻煩,這個時候就可以用到聚合。我們可以創建一個聚合用的maven項目。

對其pom.xml進行修改。

然後對該聚合的pom.xml執行clean install,在控制檯庫發現,三個項目依次被安裝到本地倉庫。

我們還會發現,前面三個項目都使用了junit的依賴,所以可以新建一個新的maven項目用來繼承.首先先創建一個父的maven項目,並對其pom.xml進行修改。

然後指定bge來對其進行繼承,並刪除pom.xml中的junit的版本號。

使用maven構建web項目

首先創建一個maven項目,這裏要注意的是在Filter那邊要選擇webapp。

 點擊next之後,展開下面的Advanced然後修改其Name template爲 [artifactId],不然創建出來的項目名字後面會多出Maven Webapp 。這對我等強迫症的程序員是萬萬不能忍的。

接下來需要檢查下classes文件的輸出路徑,在項目上右鍵Build Path-->Configure Build Path。

然後點擊Source,然後對幾個文件的輸出路徑進行修改,確保它輸出在target/classes下。

這樣我們的web項目就創建成功了!






















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章