1. 程式人生 > 其它 >Maven座標,Maven依賴,Maven倉庫

Maven座標,Maven依賴,Maven倉庫

Maven 座標

Maven 座標一套規則,它規定:世界上任何一個構件都可以使用 Maven 座標並作為其唯一標識,Maven 座標包括 groupId、artifactId、version、packaging 等元素,只要使用者提供了正確的座標元素,Maven 就能找到對應的構件。

任何一個構件都必須明確定義自己的座標,這是 Maven 的強制要求,任何構件都不能例外。我們在開發 Maven 專案時,也需要為其定義合適的座標,只有定義了座標,其他專案才能引用該專案生成的構件。

以下是 helloMaven 專案的座標定義。

<project> 
    <groupId>net.biancheng.www</groupId>
    <artifactId>helloMaven</artifactId>
    <packaging>jar</packaging>
    <version>1.0
-SNAPSHOT</version> </project>

Maven 座標主要由以下元素組成:

  • groupId:專案組 ID,定義當前 Maven 專案隸屬的組織或公司,通常是唯一的。它的取值一般是專案所屬公司或組織的網址或 URL 的反寫,例如 net.biancheng.www。
  • artifactId:專案 ID,通常是專案的名稱。
  • version:版本。
  • packaging:專案的打包方式,預設值為 jar

以上 4 個元素中groupId、artifactId 和version 是必須定義的,packaging 是可選的

Maven依賴

Maven 是一款優秀的依賴管理工具,那麼什麼是依賴呢?

通俗的說,如果一個 Maven 構建所產生的構件

(例如 Jar 檔案)被其他專案引用,那麼該構件就是其他專案的依賴。

依賴宣告

Maven 座標是依賴的前提,所有 Maven 專案必須明確定義自己的座標,只有這樣,它們才可能成為其他專案的依賴。當一個專案的構件成為其他專案的依賴時,該專案的座標才能體現出它的價值。

當 Maven 專案需要宣告某一個依賴時,通常只需要在其 POM 中配置該依賴的座標資訊,Maven 會根據座標自動將依賴下載到專案中。

例如,某個專案中使用servlet-api 作為其依賴,其配置如下。

<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"> ... <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> </project>

dependencies 元素可以包含一個或者多個 dependency 子元素,用以宣告一個或者多個專案依賴,每個依賴都可以包含以下元素:

  • groupId、artifactId 和 version:依賴的基本座標,對於任何一個依賴來說,基本座標是最重要的,Maven 根據座標才能找到需要的依賴。
  • type:依賴的型別,對應於專案座標定義的 packaging。大部分情況下,該元素不必宣告,其預設值是 jar
  • scope:依賴的範圍。
  • optional:標記依賴是否可選。
  • exclusions:用來排除傳遞性依賴。
大部分依賴宣告只包含 groupId、artifactId 和 version 三個元素,至於 scope、optional 以及 exclusions 等元素,瞭解即可

獲取依賴座標

通常情況下,絕大部分依賴的 Maven 座標都能在https://mvnrepository.com/中獲取。

例如,當專案中需要引入 junit 進行單元測試時, 我們只需要在首頁搜尋 junit 即可,如下圖。

圖1:獲取座標定位

選擇合適的版本,在依賴詳情頁的最下方就是該版本依賴的 Maven 座標,我們可以直接將其複製到專案的 pom.xml 中使用。

圖2:Maven 依賴座標

Maven倉庫(本地倉庫+遠端倉庫)

在 Maven 中,任何一個依賴、外掛或者專案構建的輸出,都可以稱為構件。

Maven 在某個統一的位置儲存所有專案的構件,這個統一的位置,我們就稱之為倉庫。換言之,倉庫就是存放依賴和外掛的地方

任何的構件都有唯一的座標,該座標定義了構件在倉庫中的唯一儲存路徑。當 Maven 專案需要某些構件時,只要其 POM 檔案中聲明瞭這些構件的座標,Maven 就會根據這些座標找自動到倉庫中找到並使用它們

專案構建完成生成的構件,也可以安裝或者部署到倉庫中,供其他專案使用。

倉庫的分類

Maven 倉庫可以分為 2 個大類:

  • 本地倉庫
  • 遠端倉庫


當 Maven 根據座標尋找構件時,它會首先檢視本地倉庫,若本地倉庫存在此構件,則直接使用;若本地倉庫不存在此構件,Maven 就會去遠端倉庫查詢,若發現所需的構件後,則下載到本地倉庫使用。如果本地倉庫和遠端倉庫都沒有所需的構件,則 Maven 就會報錯

遠端倉庫還可以分為 3 個小類:中央倉庫、私服、其他公共倉庫。

  • 中央倉庫是由 Maven 社群提供的一種特殊的遠端倉庫,它包含了絕大多數流行的開源構件。在預設情況下,當本地倉庫沒有 Maven 所需的構件時,會首先嚐試從中央倉庫下載。
  • 私服是一種特殊的遠端倉庫,它通常設立在區域網內,用來代理所有外部的遠端倉庫。它的好處是可以節省頻寬,比外部的遠端倉庫更加穩定。
  • 除了中央倉庫和私服外,還有很多其他公共倉庫,例如 JBoss Maven 庫,Java.net Maven 庫等等。


Maven 倉庫的分類如下圖。

本地倉庫

Maven本地倉庫實際上就是本地計算機上的一個目錄(資料夾),它會在第一次執行 Maven 命令時被建立

Maven 本地倉庫可以儲存本地所有專案所需的構件。當 Maven 專案第一次進行構建時,會自動從遠端倉庫搜尋依賴項,並將其下載到本地倉庫中。當專案再進行構建時,會直接從本地倉庫搜尋依賴項並引用,而不會再次向遠端倉庫獲取

Maven 本地倉庫預設地址為 C:\%USER_HOME%\.m2\repository ,但出於某些原因(例如 C 盤空間不夠),我們通常會重新自定義本地倉庫的位置。這時需要修改 %MAVEN_HOME%\conf 目錄下的 settings.xml 檔案,通過localRepository 元素定義另一個本地倉庫地址,例如:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
   http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository>D:/myRepository/repository</localRepository>
</settings>
構件只有儲存在本地倉庫中,才能被其他的 Maven 專案使用。

構件想要進入本地倉庫,除了從遠端倉庫下載到本地倉庫外,還可以使用命令 mvn install 將本地專案的輸出構件安裝到本地倉庫中。

中央倉庫

中央倉庫是由 Maven 社群提供的一種特殊的遠端倉庫,它包含了絕大多數流行的開源構件。在預設情況下,當本地倉庫沒有 Maven 所需的構件時,會首先嚐試從中央倉庫下載。

中央倉庫具有如下特點:

  • 這個倉庫由 Maven 社群管理
  • 不需要配置
  • 需要通過網路才能訪問


我們可以通過 Maven 社群提供的 URL:http://search.maven.org/#browse,瀏覽其中的構件。中央倉庫包含了絕大多數流行的開源 Java 構件及其原始碼、作者資訊和許可證資訊等。一般來說,Maven 專案所依賴的構件都可以從中央倉庫下載到。

雖然中央倉庫屬於遠端倉庫的範疇,但由於它的特殊性,一般會把它與其他遠端倉庫區分開。我們常說的遠端倉庫,一般不包括中央倉庫。

遠端倉庫

如果 Maven 在本地倉庫和中央倉庫中都找不到依賴的庫檔案,它就會停止構建過程並輸出錯誤資訊到控制檯。為避免這種情況的發生,Maven 還提供了遠端倉庫的概念,它是一種由開發人員自己定製的倉庫,其中包含了供其他專案使用的程式碼庫或者構件。

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.biancheng.www</groupId>
    <artifactId>maven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.bangcheng.common-lib</groupId>
            <artifactId>common-lib</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>bianchengbang.lib1</id>
            <url>http://download.bianchengbang.org/maven2/lib1</url>
        </repository>
        <repository>
            <id>bianchengbang.lib2</id>
            <url>http://download.bianchengbang.org/maven2/lib2</url>
        </repository>
    </repositories>
</project><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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.biancheng.www</groupId>
    <artifactId>maven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.bangcheng.common-lib</groupId>
            <artifactId>common-lib</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>bianchengbang.lib1</id>
            <url>http://download.bianchengbang.org/maven2/lib1</url>
        </repository>
        <repository>
            <id>bianchengbang.lib2</id>
            <url>http://download.bianchengbang.org/maven2/lib2</url>
        </repository>
    </repositories>
</project>

Maven 依賴搜尋順序

當通過 Maven 構建專案時,Maven 按照如下順序查詢依賴的構件。

  1. 從本地倉庫查詢構件,如果沒有找到,跳到第 2 步,否則繼續執行其他處理。
  2. 從中央倉庫查詢構件,如果沒有找到,並且已經設定其他遠端倉庫,然後移動到第4 步;如果找到,那麼將構件下載到本地倉庫中使用。
  3. 如果沒有設定其他遠端倉庫,Maven 則會停止處理並丟擲錯誤。
  4. 在遠端倉庫查詢構件,如果找到,則會下載到本地倉庫並使用,否則 Maven 停止處理並丟擲錯誤。