相信很多小白和我一樣,做一個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)
2、先聲明先優先(在路徑相同的情況下,則誰先聲明,先解析誰)則A會優先解析下面那個X的版本,畢竟短了一些嘛
聚合和繼承
如果在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項目就創建成功了!