1. 程式人生 > 其它 >【Maven從入門到精通】 02-Maven 的核心概念:POM、座標、依賴

【Maven從入門到精通】 02-Maven 的核心概念:POM、座標、依賴

Maven 的核心概念:POM、座標、依賴

筆記來源:Maven零基礎入門教程(一套輕鬆搞定maven工具)

目錄

Maven 的核心概念:POM、座標、依賴

1、POM

  • POMProject Object Model,專案物件模型
    • 類似DOMDocument Object Model,文件物件模型
  • ② pom.xml 對於 Maven 工程是核心配置檔案,與構建過程相關的一切設定都在這個檔案中進行配置
    • 重要程度相當於 web.xml 對於動態 Web 工程

2、座標

數學中的座標

  1. 在平面上,使用X、Y兩個向量可以唯一的定位平面中的任何一個點
  2. 在空間中,使用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設定,這是依賴的範圍

依賴的範圍有幾個可選值,我們用得到的是:compiletestprovided

compile 範圍依賴

  • 對主程式是否有效:有效
  • 對測試程式是否有效:有效
  • 是否參與打包部署:參與

test 範圍依賴

  • 對主程式是否有效:無效
  • 對測試程式是否有效:有效
  • 是否參與打包部署:不參與

provided 範圍依賴

  • 對主程式是否有效:有效
  • 對測試程式是否有效:有效
  • 是否參與打包部署:不參與

compile & test 對比

compile & provided 對比

小結

依賴範圍 compile test provided
對主程式是否有效 ✔️ ✔️
對測試程式是否有效 ✔️ ✔️ ✔️
是否參與打包部署 ✔️