【Maven從入門到精通】 02-Maven 的核心概念:POM、座標、依賴
目錄
Maven 的核心概念:POM、座標、依賴
1、POM
- ①
POM
:Project Object Model
,專案物件模型- 類似
DOM
:Document Object Model
,文件物件模型
- 類似
- ② pom.xml 對於 Maven 工程是核心配置檔案,與構建過程相關的一切設定都在這個檔案中進行配置
- 重要程度相當於 web.xml 對於動態 Web 工程
2、座標
數學中的座標
- 在平面上,使用X、Y兩個向量可以唯一的定位平面中的任何一個點
- 在空間中,使用X、Y、Z三個向量可以唯一的定位空間中的任何一個點
Maven 的座標
使用下面三個引數GAV
在倉庫中唯一定位一個 Maven 工程
-
G
——groupId
:公司或組織域名倒序 + 專案名<groupId>com.vectorx.maven</groupId>
-
A
——artifactId
:模組名<artifactId>Hello</artifactId>
-
V
——version
:版本號<version>1.0.0-SNAPSHOT</version>
Maven 工程的座標與倉庫中路徑的對應關係
Maven 工程的座標:
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
倉庫中路徑:
org\springframework\spring-core\4.0.0.RELEASE\spring-core-4.0.0.RELEASE.jar
3、倉庫
3.1、倉庫的分類
-
本地倉庫:本地部署的倉庫目錄,為當前電腦所有 Maven 工程服務
-
遠端倉庫
-
私服:搭建在區域網中,為區域網範圍內的所有 Maven 工程服務
-
中央倉庫:搭建在 Internet 上,為全世界所有 Maven 工程服務
-
中央倉庫映象:搭建在各大洲,為中央倉庫分擔流量。減輕中央倉庫的壓力,同時更快的響應使用者請求
-
3.2、倉庫的內容
- Maven 自身所需的外掛
- 第三方框架或工具的 Jar 包
- 自己開發的 Maven 工程
4、第二個 Maven 工程
目錄結構
pom.xml
<?xml version="1.0"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.vectorx.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HelloFriend</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.vectorx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
HelloFriend
public class HelloFriend {
public String sayHello2Friend(String name) {
Hello hello = new Hello();
String str = hello.sayHello(name) + " I am " + this.getMyName();
System.out.println(str);
return str;
}
public String getMyName() {
return "John";
}
}
HelloFriendTest
public class HelloFriendTest {
@Test
public void testHelloFriend() {
HelloFriend helloFriend = new HelloFriend();
String results = helloFriend.sayHello2Friend("world");
assertEquals("Hello world! I'm John", results);
}
}
此時,我們執行mvn compile
命令,能否成功呢?
我們發現,編譯失敗了:
Failed to execute goal on project HelloFriend: Could not resolve dependencies for project com.vectorx.maven:HelloFriend:jar:0.0.1-SNAPSHOT: Could not find artifact com.vectorx.maven:Hello:jar:0.0.1-SNAPSHOT
即:無法解決 HelloFriend 包中的依賴,找不到 Hello 的 Jar 包
根據前面所學知識,我們知道:
- 執行的 Maven 命令需要用到某些外掛時,Maven 核心程式會首先在本地倉庫中查詢
- 如果在本地倉庫中找不到需要的外掛,會自動到中央倉庫下載。如果此時無法連線外網,則構建失敗
而我們這裡的Hello
本身是自定義的 Maven 工程,其中的座標也是自定義的,中央倉庫中是幾乎不可能有的
我們希望的是 Maven 核心程式在本地倉庫中尋找,並且能夠找到,這就要了解下 Maven 依賴的相關知識了
5、依賴(初步介紹)
5.1、依賴的基本操作
Maven 解析依賴資訊時會到本地倉庫中查詢被依賴的 jar 包
對於我們自己開發的 Maven 工程,使用mvn install
命令安裝後就可以進入倉庫
》》》我們實操一遍
我們注意到,install
命令,將工作空間中 Hello 的 Jar 包安裝到了預設的使用者家目錄下
[INFO] Installing D:\workspace\NOTE_Maven\Demo\Hello\target\Hello-0.0.1-SNAPSHOT.jar to C:\Users\Archimedes\.m2\repository\com\vectorx\maven\Hello\0.0.1-SNAPSHOT\Hello-0.0.1-SNAPSHOT.jar
[INFO] Installing D:\workspace\NOTE_Maven\Demo\Hello\pom.xml to C:\Users\Archimedes\.m2\repository\com\vectorx\maven\Hello\0.0.1-SNAPSHOT\Hello-0.0.1-SNAPSHOT.pom
我們開啟自己的使用者家目錄,確實發現了 Hello 的 Jar 包已經安裝到了我們的本地倉庫中
好,現在我們再次對 HelloFriend 進行編譯,看下是否會成功
果然不負眾望,編譯成功了!
5.2、依賴的範圍
大家注意到上面的依賴資訊中除了目標 jar 包的座標還有一個scope
設定,這是依賴的範圍
依賴的範圍有幾個可選值,我們用得到的是:compile
、test
、provided
compile 範圍依賴
- 對主程式是否有效:有效
- 對測試程式是否有效:有效
- 是否參與打包部署:參與
test 範圍依賴
- 對主程式是否有效:無效
- 對測試程式是否有效:有效
- 是否參與打包部署:不參與
provided 範圍依賴
- 對主程式是否有效:有效
- 對測試程式是否有效:有效
- 是否參與打包部署:不參與
compile & test 對比
compile & provided 對比
小結
依賴範圍 | compile | test | provided |
---|---|---|---|
對主程式是否有效 | ✔️ | ❌ | ✔️ |
對測試程式是否有效 | ✔️ | ✔️ | ✔️ |
是否參與打包部署 | ✔️ | ❌ | ❌ |