1 Maven 介紹
是什么
Maven是一個項目管理工具,它包含一個目標對象模型POM(project Object Model),一個項目生命周期(Project Lifecycle),一個依賴管理系統(Dependency Management System)和用來運行定義在生命周期階段中插件目標的邏輯。
約定優于配置
約定優于配置是一個簡單的概念,系統、類庫、框架給定一個合理的默認值。Maven通過給項目提供默認行為來融合這一概念,在沒有自定義的情況下
- 源代碼放在:
workspace/src/main/java
- 資源文件放在:
workspace/src/main/resources
- 測試代碼放在:
workspace/src/test
- 字節碼文件放在:
workspace/target/classes
- 可發行的jar包放在:
workspace/target
Maven和Ant的區別
Apache Ant
- Ant 沒有正式的約定一個項目的目錄結構,你必須明確的告訴Ant哪里放源碼,哪里放字節碼等。
- Ant 是程序化的,你必須告訴 Ant 做什么,什么時候做。
- Ant 沒有生命周期,你必須定義目標和目標之間的依賴。
Apache Maven
- Maven 擁有約定,遵守了約定, Maven 就知道你的源代碼放在了哪里。
- Maven 是聲明式的。你只需要創建一個 pom.xml 文件并將其放在默認的目錄下, Maven 就會幫你干其他的事了。
- Maven 擁有生命周期,當你運行相應的命令后就會被調用,這條命令會告訴 Maven 執行一系列的有序步驟, 直到達到指定的生命周期。
2 Maven 安裝
Maven安裝
安裝及環境變量設置成功顯示
- java -version
- mvn -v
Maven目錄及配置說明
我們先打開安裝好的 Maven目錄看看。
其中:
- bin目錄:包含了運行 Maven 的一些腳本。
- boot目錄:包含了一個負責創建 Maven 運行所需要的類加載器的 jar 文件 。
- conf目錄:包含了一個全局的 settings.xml 文件,該配置文件用來自定義你電腦上的 Maven 的行為。如果我們要自定義 Maven,我們通常會將該配置文件覆蓋掉 ~/.m2目錄下的 settings.xml 文件。
- lib目錄:包含了 Maven的核心jar包。
- LICENSE:包含了 Apache Maven 的軟件許可證。
- NOTICE:包含了 Maven 依賴的類庫所需要的通告及權限。
- README.txt:包含了一些安裝指令
接著我們再來看看本地的 Maven 倉庫,進入~/.m2
目錄
其中:
- settings.xml:包含了用戶的相關憑證,倉庫和其它信息的配置。
- repository目錄:本地倉庫,當從maven遠程倉庫下載jar依賴的時候,會自動下載到該目錄下。
3 第一個demo
當我們把maven環境搭建好之后,我們來創建一個maven項目。
1) 創建 maven 項目
mvn archetype:create
-DgroupId=org.sonatype.mavenbook.ch03 //項目id
-DartifactId=demo //項目名
-DpackageName=com.acey.demo //包的目錄結構
注意
- 第一次創建maven項目會自動下載很多jar包。
- 如果你的 maven 版本是
- 2.x,使用命令
mvn archetype:create
創建maven項目 - 3.x,使用命令
mvn archetype:generate
創建maven項目 - 如果運行上面的命令出現卡死
卡死
那么需要加上參數-DarchetypeCatalog=internal
,讓maven 不要從遠程服務器上獲取catalog。
mvn archetype:generate
-DgroupId=org.sonatype.mavenbook.ch03 //項目id
-DartifactId=demo //項目名
-DpackageName=com.acey.demo //包的目錄結構
-DarchetypeCatalog=internal
一切順利的話,我們便可以在當前目錄下找到我們創建的 maven 項目了,打開后可以看到項目的目錄結構。
2)mvn install
在項目跟路經下執行 mvn install
命令
mvn install
可以先看下整個執行步驟,詳情會在后面的 maven 生命周期中詳細介紹。
3)運行
java -cp target/demo-1.0-SNAPSHOT.jar com.acey.demo.App
4 核心概念
1)Maven 插件和目標(Plugins and Goals)
一個 Maven 插件(plugin)是一個或多個目標(goal)的集合。而一個目標是 Maven 中的一個工作單元(unit of work),他可以作為以個單獨的目標運行,也可以作為一個大的構建的一部分和其它目標一起運行。用以下格式表示:
pluginId:goalId
在我們構建 Maven 項目時,我們便用到了archetype
插件和generate
目標。當然目標也是可以定義一些參數。
mvn archetype(插件):generate(目標)
-DgroupId=org.sonatype.mavenbook.ch03 //目標參數
-DartifactId=demo //目標參數
-DpackageName=com.acey.demo //目標參數
-DarchetypeCatalog=internal //目標參數
2)生命周期(Lifecycle)
Maven有三套相互獨立的生命周期
- Clean Lifecycle:在真正的構建之前進行項目的清理工作
- Default Lifecycle:構建的核心部分,包含編譯、測試、打包、部署等。
- Site Lifecycle:生成項目報告,站點,發布站點。
其中:
Default Lifecycle包含了一系列階段的序列。
插件目標也是可以附著在生命周期上的,它會隨著生命周期的移動,執行附著在不同生命周期上的目標。每個階段上附著的零個或多個目標。例如:放我們執行 mvn package
時,我們會發現它會默認的執行該生命周期前的生命周期所對應的目標,當達到目標生命周期(package)時,會執行附著在package
上的jar:jar
進行打包。
我們再來看看每個周期所對應的目標
mvn package 會自動執行它前面周期所對應的目標,然后打包
mvn jar:jar 只會打包
Clean Lifecycle一共包含三個階段
- pre-clean:執行一些需要在 clean 之前完成的任務
- clean:移除所有上次構建所生成的文件
- post-clean:執行一些需要在 clean 之后完成的任務
Site Lifecycle一共包含了四個階段
- pre-site:執行了一些需要在生成報告站點之前完成的工作
- site:生成項目的站點文檔
- post-site:執行一些需要在生成報告站點之后完成的任務
- site-deploy:將生成的站點文檔部署到遠程服務器
當我們執行mvn site
后,我們會發現我們的 target 目錄下會生成一個 site 目錄,里面包含了項目的各種報告。
3)Maven 坐標(Coordinates)
Maven坐標定義了一組標識,它可以用來唯一標識一個項目,一個依賴,或者是一個POM里面的插件。我們先來看一個簡單的POM。
其中 groupId、artfiactId、version和packaging共同組成了項目的坐標,Maven通過一個坐標來定位一個項目,Maven 坐標一般會用冒號作為分隔符來書寫。
groupId:artifactId:packaging:version
在上圖的項目坐標就可以表示為:
testdemo:demo:jar:1.0-SNAPSHOT
當然這個符號也應用于項目依賴,上圖項目中依賴了 JUnit的3.8.1版本,那么它就包含了一個junit:junit:jar:3.8.1
的依賴。
- groupId:表示一個團體標識,它一般以創建這個項目的組織名稱的逆向域名(version domain name)開頭。比如 Apache Software 就以·org.apache·作為 groupId。
- artifactId:在 groupId 下的表示一個單獨項目的唯一標識,一般為項目名。
- version:一個項目的特定版本。如果是正在開發中的項目那么一般會加上一個特殊的標識,在版本號前加上 “SNAPSHOT"的標記。
- package:項目的類型,默認為jar,描述了項目打包后的輸出格式。也可以打包成一個 war。
4)Maven 倉庫(Repositories)
當我們在運行 Maven 項目的時候,Maven 會從 pom.xml 中查找已配置的插件坐標,然后在本地倉庫中查找是否有對應的插件,如果沒有那么就會從 Maven 自帶的遠程倉庫http://repo1.maven.org/maven2 中下載所需要的插件緩存到本地倉庫。本地倉庫的默認地址:
- window中:* C:\Users\USERNAME.m2\repository*
- linux中:~/.m2/repository
如果我們有需要的話也是可以修改本地倉庫的地址
- 更改配置用戶范圍的本地倉庫:
- 在 /.m2/ 目錄下創建一個setting.xml或者將
M2_HOME/conf/settings.xml
拷過來 - 在 setting.xml 中添加以下節點。
<settings>
<localRepository>新的倉庫地址</localRepository>
</settings>
- 更改配置全局范圍的本地倉庫
- 直接在
M2_HOME/conf/settings.xml
添加以下節點
<settings>
<localRepository>新的倉庫地址</localRepository>
</settings>
當 Maven升級后,所有的配置都將會被清除,所以一般不推薦修改全局的配置
Maven插件存儲結構
在我們打開本地倉庫(repository) 后,我們會看到很多的插件,Maven 倉庫會按以下目錄格式來存儲插件。
/< groupId >/< artifactId >/< version >/< artifactId >-<version>.< packaging >
比如 c3p0-0.9.1.2.jar
的存儲方式
當我們用
mvn install
對項目進行install時,Maven 也會按上述的格式將所生成的jar/war包保存在倉庫中作為依賴插件。
5)Maven 依賴管理(Dependency Management)
所謂依賴就是項目中使用了一些插件,當我們需要運行項目時,我們必須將相應的插件加進來。而 Maven 依賴管理則是將所需要的插件下載到本地倉庫,當我們需要使用插件時,只需要在 pom.xml 中去配置相關的依賴即可。
可以看到我們需要加一個依賴也是很簡單,只需要在 pom.xml 中在 dependencies
下加一個 dependency
即可,其中 groupId
、artifactId
和version
決定了 junit的坐標,而 scope
則表示junit的作用范圍,test 表示只有項目在執行 compiler:testCompile
和 surefire:test
目標的時候才會被加入到 classpath中。
幾個 scope 范圍
- compile,缺省值,適用于所有階段,會隨著項目一起發布。
- provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
- runtime,只在運行時使用,如JDBC驅動,適用運行和測試階段。
- test,只在測試時使用,用于編譯和運行測試代碼。不會隨項目發布。
- system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。
Maven 的基礎概念就差不多啦,大家有疑問的話可以在下方留言哦。??
下一篇會講講實戰和更深層次的內容。
(? ω ?)喜歡的話點個?唄。