Maven指南(一) - 兩小時從零到了解

目錄導航,方便大家選擇性查看

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目錄看看。

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目錄

本地 maven 倉庫

其中:

  • 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 項目了,打開后可以看到項目的目錄結構。


demo 目錄結構

2)mvn install

在項目跟路經下執行 mvn install命令

mvn install
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 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 目錄,里面包含了項目的各種報告。

mvn site

3)Maven 坐標(Coordinates)

Maven坐標定義了一組標識,它可以用來唯一標識一個項目,一個依賴,或者是一個POM里面的插件。我們先來看一個簡單的POM。

pom

其中 groupIdartfiactIdversionpackaging共同組成了項目的坐標,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的存儲方式

c3p0

當我們用mvn install對項目進行install時,Maven 也會按上述的格式將所生成的jar/war包保存在倉庫中作為依賴插件。

5)Maven 依賴管理(Dependency Management)

所謂依賴就是項目中使用了一些插件,當我們需要運行項目時,我們必須將相應的插件加進來。而 Maven 依賴管理則是將所需要的插件下載到本地倉庫,當我們需要使用插件時,只需要在 pom.xml 中去配置相關的依賴即可。

pom.xml

可以看到我們需要加一個依賴也是很簡單,只需要在 pom.xml 中在 dependencies 下加一個 dependency 即可,其中 groupIdartifactIdversion決定了 junit的坐標,而 scope 則表示junit的作用范圍,test 表示只有項目在執行 compiler:testCompilesurefire:test目標的時候才會被加入到 classpath中。

幾個 scope 范圍

  • compile,缺省值,適用于所有階段,會隨著項目一起發布。
  • provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
  • runtime,只在運行時使用,如JDBC驅動,適用運行和測試階段。
  • test,只在測試時使用,用于編譯和運行測試代碼。不會隨項目發布。
  • system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。

Maven 的基礎概念就差不多啦,大家有疑問的話可以在下方留言哦。??
下一篇會講講實戰和更深層次的內容。
(? ω ?)喜歡的話點個?唄。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容