Maven使用教程一:Maven基礎

使用Maven快速建立一個工程

爲了加快速度,在setting.xml中加一段配置,用國內阿里雲的鏡像倉庫能夠去下載各類東西。java

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

而後測試下,在終端輸入:apache

進入代碼保存的相關目錄緩存

cd /Users/wangmeng/Documents/space/learn

構建一個maven工程:架構

mvn archetype:generate -DgroupId=com.wangmeng.maven -DartifactId=maven-first-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

此時maven會在當前目錄下 新建一個目錄,名稱就是-DartifactId指定的名稱。這個這個目錄,就能夠看到maven自動給咱們初始化好了一個工程對應的目錄結構。app

maven的約定

這就是基本的maven工程目錄結構,其中src/main/java目錄包含了這個項目的java源碼,src/test/java目錄包含了測試代碼,pom.xml文件就是maven的核心配置文件maven

pom.xml初步介紹

pom.xml文件是一個項目最核心的maven配置文件,包含了大量的信息,maven真是基於這裏的配置信息來對工程進行構建管理工做的。一個最基本的pom.xml文件如maven生成的pom.xml所示。ide

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.zhss.maven</groupId>
  <artifactId>maven-first-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>maven-first-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
  • :pom.xml中的頂層元素
  • :POM自己的版本號,通常不多改變
  • :建立這個項目的公司或者組織,通常用公司網站後綴,好比com.company
  • :這個項目的惟一標識,通常生成的jar包名稱,會是 - . 這個格式,好比說myapp-1.0.jar
  • :要用的打包類型,好比jar,war等等
  • :這個項目的版本號
  • :這個項目用於展現的名稱,通常在生成文檔的時候使用
  • :這是這個項目的文檔能下載的站點url,通常用於生成文檔
  • :用於項目的描述

maven體系結構

咱們項目中的pom.xml是如何依賴以及構建的呢?測試

全局的maven配置,settings.xml
maven的約定:各類約定目錄,代碼/資源/輸出/測試網站

mvn構建命令:ui

  • maven必定會去考慮settings.xml配置文件裏的一些配置
  • maven會去解析你的maven工程的pom.xml
  • maven會去看你的pom.xml裏聲明瞭哪些依賴
  • maven會去本地倉庫裏找有沒有這些依賴,好比有沒有junit
  • 若是本地倉庫沒有junit,那麼就會去遠程倉庫去找,下載junit,所謂的運程倉庫裏包含了幾乎全部的依賴包
  • 遠程倉庫下載到了junit之後,就會放到本地倉庫,緩存起來,供你之後去使用,maven的遠程中央倉庫:https://repo.maven.apache.org/maven2/

maven的體系結構圖:
maven體系結構圖.png

Maven座標

每一個maven項目都有一個座標
groupId+artifactId+version+packaging+classifier 五個維度的座標,惟必定義一個依賴包,任何一個項目,都是用這五個維度惟必定位一個發佈包。

  • groupId:通常是公司或者組織的官網域名倒序來開頭,好比com.baidu大頭
  • artifactId:項目中的某個模塊,或者某個服務名
  • version:工程的版本號
  • packaging:這個工程的發佈包打包方式,通常經常使用的就是jar和war年終
  • classifier:不多用,定義某個工程的附屬項目,好比hello-world工程的 hello-world-source工程,就是源碼

例如:
groupId: com.wangmeng.oa
artifactId: oa-organ
version: 1.0.0-SNAPSHOT

  • version中第三位是小版本,通常修復了一些bug 或者輕微的改動會累加第三位小版本
  • 第二位是小版本,通常若是一路一些新的功能或模塊,或者作了一些重構,會累加第二位小版本
  • 第一位是大版本,通常就是若是總體架構有特別的升級或者變化,纔會累加第一位大版本。
  • SNAPSHOT,就是當前這個版本下的快照版本,表明代碼正在開發或者測試中,能夠試用,可是沒有通過完善測試,不會承諾很是穩定

Maven依賴管理機制

<dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <type></type>
        <scope></scope>
        <optional></optional>
</dependency>

1,依賴範圍:

  • compile:默認,對編譯、測試和運行的classpath都有效
  • test:僅僅對於運行的測試代碼的classpath有效
  • provided:編輯和測試的時候有效,可是在運行的時候無效
  • runtime:測試和運行classpath有效,可是編譯代碼時無效

2,傳遞性依賴

maven的依賴性傳遞,就是說會自動遞歸解析全部的依賴,而後負責將依賴下載下來,全部層級的依賴都會成爲咱們項目的依賴。

好比說咱們依賴於A是compile範圍,A依賴於B,B是test範圍。那麼A只有在測試的時候纔會使用B。

傳遞性依賴機制對依賴範圍也是有影響的,好比下面的表格,第一列是一級依賴,第一行是二級依賴,傳遞性依賴會致使多級依賴的依賴範圍交叉在一塊兒,會有影響。

3,依賴調解

依賴傳遞性會致使依賴衝突的問題,例如

好比A->B->C->X(1.0),A->D->X(2.0),A有兩個傳遞性依賴X,不一樣的版本

此時就會依賴調解,就近原則,離A最近的選用,就是X的2.0版本

若是A->B->X(1.0)和A->D->X(2.0),路徑等長呢?那麼會選擇第一聲明原則,哪一個依賴在pom.xml裏先聲明,就用哪一個

4,可選依賴
<optional>true</optional> 此時以來傳遞失效,不會向上傳遞。

Maven依賴衝突

1,依賴衝突
由於maven的依賴具備傳遞性,因此就應運而生了依賴的衝突
好比咱們同時依賴A和B,此時A依賴了C-1.0, B依賴了D,D依賴了C-2.0

按照上面所說取最短路徑,因此咱們項目依賴C-1.0
若是C-1.0 有方法CClass.sayHello()
C-2.0中添加新方法CClass.printHello()

D調用C-2.0中的printHello()這個方法,這時由於項目中依賴的是C-1.0,因此使用時就會報錯

2,解決依賴衝突
mvn depedency:tree命令,查看項目中maven依賴關係樹,而後將有衝突的依賴找出來,在pom中使用exclusion處理。

A
  --C-1.0
B
  --D
    --C-2.0

<dependency>
    <groupId>A</groupId>
    <artifactId>A</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>C</groupId>
            <artifactId>C</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Maven的多層倉庫架構

maven倉庫的大類分爲本地倉庫和遠程倉庫兩種,若是咱們聲明瞭一個依賴,那麼在構建打包的時候,先會去本地倉庫找,這個本地倉庫的地址默認就是~/.m2/repository目錄下面,固然settings.xml文件是能夠修改這個地址的。若是本地倉庫找不到,那麼就會去遠程倉庫找,默認是去maven本身的中央倉庫裏找,maven的中央倉庫幾乎涵蓋全部的依賴,而後會將中央倉庫的依賴下載下來放到本地倉庫,緩存起來,供下次使用。

maven多層倉庫架構.png 感興趣的小夥伴可關注我的公衆號:壹枝花算不算浪漫

相關文章
相關標籤/搜索