1.什麼是Maven html
4.pom.xml介紹 前端
5.Maven與myeclipse的集成使用 java
6.Maven項目目錄結構的說明 web
7. Maven打包集成 spring
=================== 正文 ================= shell
也許你據說過Maven,也許你知道不少開源的項目裏在使用它。那麼什麼是Maven?apache
簡而言之,Maven是一個優秀的項目構建工具。app
Maven幫助咱們自動化項目構建過程,具體來講包括項目的清理,編譯,測試,生成測試報告,打包和部署。只須要輸入很簡潔的命令,就能實現這些構建過程。好比輸入mvn clean compile ,就能完成項目的清理和編譯。同時,Maven提供jar包的依賴管理。框架
咱們已經有了Ant ,它也可以完成項目構建的不少工做。那麼,咱們仍是否須要Maven?eclipse
1) Maven更簡潔,更大程度的消除了重複的步驟
Ant 是過程式的,在幾乎每個工程裏,都須要在build.xml中編寫 compile, pack等操做。
Maven是聲明式的 , 只要在配置文件中聲明項目的基本元素就能夠了。編譯打包等操做,只要命令行輸入相似 mvn clean compile。
2) Maven提供jar包的依賴管理
某一天你接手了一個新的項目,需求既然都已明確,技術方案也已經肯定,那還等啥?火速搭建框架吧。
按照慣例,你天然引入了spring。因而你從官網上找到了spring-core-3.2.3.RELEASE.jar,整合到了項目中。可是你發現啓動時項目報錯了,提示缺乏相關類或者說依賴。以你數年碼農的經驗,你果判定位了問題 — 缺乏了依賴的jar包,好比說spring-beans-3.2.3.RELEASE.jar。 你火速找到了這個jar包,加入了工程。再運行項目試試?你發現錯誤日誌變了,但仍是提示缺乏另外一個依賴。這難不倒你,你又找來了spring-aop-3.2.3.RELEASE.jar。但是再一次,啓動失敗了,錯誤日誌變了,但仍然有ClassNotFound。
也許半天時間裏你都在反覆上面的工做 。對於各式各樣的jar包和依賴,你無從下手。只能經過不斷的調試,查看錯誤日誌,再利用搜索引擎,慢慢補齊這些依賴的jar包。
Maven極大簡化了這個過程,咱們再也不須要對各類依賴瞭如指掌,再也不須要花費時間手工尋找,下載這些依賴。
Maven 有一箇中央倉庫,提供了各類第三方jar包,對於每一個jar都用座標惟一標識。咱們只須要提供座標(也就是對應一個jar),就能從中央倉庫自動下載這些包及相關依賴。
好比:提供spring-core-3.2.3.RELEASE.jar的座標,maven會自動下載這個包以及依賴包:spring-beans-3.2.3.RELEASE.jar 和 spring-aop-3.2.3.RELEASE.jar 等(這裏只是例子,真實的依賴關係未必如此)。
後面咱們會看到如何在中央倉庫查找jar包。
下載JDK1.5或以上
下載 Maven3.0.5 http://maven.apache.org/docs/3.0.5/release-notes.html
1) Maven環境配置
解壓下載的Maven,好比放在D:/soft/apache-maven-3.0.5
添加環境變量 (和配置java變量同樣):
變量名: M2_HOME
變量值: D:/soft/apache-maven-3.0.5
在變量path尾部加上 ; %M2_HOME%\bin
打開命令行驗證maven環境是否配置成功:
在命令行輸入 mvn –v ,看是否輸出Maven home等信息。
2) 本地倉庫位置設置:
從中央倉庫下載的jar包,都會統一存放到本地倉庫中。在這裏咱們須要配置本地倉庫的位置。
打開D:\soft\apache-maven-3.0.5\conf\setting.xml文件,在下圖紅框部分,填入本地倉庫位置。
3) 命令行建立Maven項目
打開命令行, 輸入 mvn archetype:generate
界面上會輸出不少信息,並提示輸入要選擇的archetype編號:
這裏咱們直接按回車鍵,即選擇默認編號284。輸入後界面顯示以下,提示選擇其version:
按回車鍵,選擇默認編號6對應的version。以後會提示輸入groupId, artifactId,version,package
這裏groupId指 建立項目的小組的惟一標示。 ArtifactId是 該產品id。紅色框部分是我本身填寫的。
後面的version和package,系統都提供了默認值。若是要採納默認值,直接按回車鍵。
最後Y:處,表示是否確認以上信息,填Y按回車則開始建立。
注:
1. 若是是第一次構建項目,全部依賴的jar包都要從maven的中央倉庫下載。
2. SNAPSHOT表示該版本處於開發階段,是不穩定的版本。
至此,項目建立成功。
4) 編譯Maven項目
經過命令行,進入該項目目錄,輸入mvn clean compile命令。
Maven會在該項目目錄下新建target目錄,把編譯完的class文件放於其中。
此時會從中央倉庫下載須要的jar包,若是須要的話。
5) 轉換成eclipse項目
到目前爲止,儘管Maven項目已建立,但還沒法導入到eclipse(或myeclipse)中。
能夠輸入命令 mvn eclipse:eclipse 把該項目轉換成eclipse (或myeclipse)項目。而後就能夠導入了。
在5.1中,咱們具體看一下如何在myeclipse中進行一些Maven構建。(以前更多的是經過命令行代碼)
注:若是更新了依賴,須要執行mvn eclipse:eclipse纔會更新myeclipse 中build path。不然myeclipse中的libraries不會引入新的依賴。
在以前建立的Maven項目中,咱們發現根目錄下有一個pom.xml文件。它是Maven項目的標誌。咱們看一下pom文件的內容。
groupId : 建立項目的小組的惟一標示。
artifactId: 該產品id。會做爲產生的jar/war包名的一部分。它和version一塊兒構成輸出包的包名。
Version: 產品版本
Packaging: 打包的類型
Name: 項目名稱,用於maven產生的文檔中。
url:指定項目站點,一般用於maven產生的文檔中。
description:描述此項目,一般用於maven產生的文檔中。
Properties: 屬性。這裏設置編碼方式爲UTF-8
Dependencies: 依賴的jar包
咱們注意到,在dependency中,也有<groupId>,<artifactId>,<version>這樣的節點。這三個元素是jar包座標的重要組成部分。它指定了咱們要從中央倉庫獲取的jar。
那麼如何知道所要jar的座標呢?
能夠在Maven搜索站中搜索: http://search.maven.org/
在搜索結果中找到須要的jar包,把相應的座標填寫在pom.xml文件中。
此外,咱們還注意到,<dependency>下有一個<scope>test</scope>。它設定了jar包的做用域,這裏指junit包僅在測試時使用。在正式打包的時候,並不會引入到工程中。若是去掉這行代碼,那麼Maven會採用默認的compile範圍,那麼不管在測試或者打包時,該jar包都會被工程引用,生成的包中會含有junit。
5.1 在myeclipse中的項目構建
在具體操做以前,先作2個基礎設置:
1)設置Maven配置位置,取消myeclipse內嵌的Maven (Embedded Maven)
點擊Window -> Preference -> MyEclipse Enterprise Workbench -> Maven4Myeclipse
在紅色框處填寫Maven配置文件位置。
再點擊Maven4Myeclipse 下的Installation , 取消右邊框中的Embedded Maven, 增長一個外部Maven,指向Maven安裝目錄
內嵌的Maven版本可能會與咱們以前實際安裝的外部Maven版本不一致,致使一些異常錯誤,所以不使用。
2)新建一個指向Maven本地倉庫的Classpath變量
點擊Window -> Preference -> Java –> Build Path -> ClassPath Variable ,而後點add,新增一個
變量M2_REPO, 指向Maven本地倉庫。
而後看一下如何進行編譯,測試等構建操做。
右鍵pom.xml -> run as, 在彈出框中咱們看到:
Maven package
Maven clean
Maven test
….
他們依次至關於命令行的:
mvn package(打包)
mvn clean (清理)
mvn test (執行測試用例)
注: 每次打包時都會自動執行一遍測試用例,生成測試報告。
5.2 直接在myeclipse中的建立Maven項目
點擊 File -> new , 選擇Java Maven Project ,而後彈出對話框:
其中Group Id 和 Artifact Id應該不陌生了,同命令行建立是同樣的。
建立完,就能夠看到pom.xml文件生成了。而且工程上有一個紅色的Maven標誌。
這裏特別說明一下:
若是此時須要增長依賴,能夠修改pom.xml。修改完以後,系統會當即更新classpath,能夠在工程的libraries中看到新加的依賴已經加入了。
可是若是經過第三節命令行的方式建立的工程,那麼修改完pom.xml以後,myeclipse中的classpath並不會當即更新,須要執行mvn eclipse:eclipse。(注意執行該命令以後,工程的class文件輸出路徑會恢復默認值)
6.1 默認目錄結構
Maven項目遵循統一的目錄結構規範。在構建過程當中,Maven會根據默認的路徑去尋找相關的代碼。新的工程應儘量的遵循這種結構
1) 普通Java工程
不管以何種方式建立完Maven Java工程(命令行或者IDE),最終呈現的目錄結構都是:
其中src/test目錄下的都是測試用的代碼和配置文件,打包時不會引入這些文件。
而src/main下都是項目的主代碼。
2) Java Web 工程
注意與傳統java web 項目不一樣, webapp目錄被放置於 src/main/ 目錄下。因爲部署時會從設置的web根目錄找文件,所以必須確保:
1) web-root folder的值爲 src/main/webapp
2) class輸出路徑的值爲 src/main/webapp/WEB-INF/classes
6.2 自定義目錄結構
若是要把已有項目遷移成Maven項目,目錄結構可能不合適進行改造。這時就須要經過配置pom.xml文件,來修改Maven的各類路徑,包括主代碼路徑,測試代碼路徑等。如下是一些可配的路徑:
1) 主源碼路徑
<project>
<build>
<sourceDirectory> XXX </ sourceDirectory>
</build>
</project>
在這裏簡寫成 project.build.sourceDirectory
2) 測試源碼路徑
Project.build.testDirectory
其餘還有構建項目輸出目錄,項目主代碼編譯輸出目錄等。有興趣能夠參見《Maven實戰》
一般狀況下,Maven只是把普通Java 工程打成jar包。 可是不少時候,咱們實際須要的多是一個更復雜的目錄結構。生成的不只包含jar包,還包括lib,configure,shell等目錄。
7.1 場景
有這樣一個工程test,目錄結構以下:
想把該工程打成一個zip包,zip包中包含一個根目錄,根目錄下的目錄結構是:
2.如何實現
爲達到這個效果,咱們須要作兩件事:
1.先修改pom.xml,引入該插件。
2.再增長一個配置文件打包配置文件package.xml。
咱們看一下的配置文件大致是怎麼樣的:
Pom.xml中增長:
artifactId 指出了要用的插件產品Id
configuration 中 appendAssemblyId 表明是否在輸出的包名中添加集成編號,這裏false表示不須要。
Descriptors 表示具體描述打包的配置文件是哪一個。
execution的設置是爲了將maven-assembly-plugin繼承到標準的maven打包過程當中,這樣在運行maven-package時就會執行maven-assembly-plugin的操做,從而實現咱們須要的自定義打包。
Package.xml的內容以下:
format : 打包格式,這裏是zip
fileSet:裏面設置了源地址和目標目錄。好比第一個fileSet,把src/main/resources下的文件打包到config目錄下。
Dependency: 處理依賴包的打包位置。其中useProjectArtifact表示包含項目自己生成的jar包(爲true時包含)。Include表示打包時,須要包含的依賴。一般用groupId:artifactId的形式指定要加入哪些依賴。
注:source package中有一個叫major,這裏並無配置把它下面的內容打包,所以輸出包內沒有major下的類。
Package.xml 可供設置的內容不少,詳情請參考:
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html