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 構建所產生的構件
依賴宣告
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 即可,如下圖。
選擇合適的版本,在依賴詳情頁的最下方就是該版本依賴的 Maven 座標,我們可以直接將其複製到專案的 pom.xml 中使用。
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 按照如下順序查詢依賴的構件。
- 從本地倉庫查詢構件,如果沒有找到,跳到第 2 步,否則繼續執行其他處理。
- 從中央倉庫查詢構件,如果沒有找到,並且已經設定其他遠端倉庫,然後移動到第4 步;如果找到,那麼將構件下載到本地倉庫中使用。
- 如果沒有設定其他遠端倉庫,Maven 則會停止處理並丟擲錯誤。
- 在遠端倉庫查詢構件,如果找到,則會下載到本地倉庫並使用,否則 Maven 停止處理並丟擲錯誤。