基於Maven建立SpringBoot的2種方式

chuimber發表於2024-04-28

先說兩種方式

  • 繼承SpringBoot提供的父Pom
  • 在依賴關係管理<dependencyManagement>中透過新增帶有 scope=import 的 spring-boot-dependencies 工件來進行依賴項管理

繼承SpringBoot提供的父Pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.0</version>
</parent>

這樣做的目的是將 Spring Boot 的父 POM 作為當前 Maven 專案的父級,以便繼承其預設配置和依賴項。

對工件溯源可以看到spring-boot-starter-parent的父pom為spring-boot-dependencies,在spring-boot-dependencies中對各種依賴版本進行了預定義,可以統一專案中的版本依賴,從而避免了潛在的版本衝突。在這種情況下,我們只需要宣告所需的相關依賴,而不必顯式指定版本號。

例如,如果要建立一個使用 Spring Web 模組的 Spring Boot 應用程式,則只需要新增以下依賴項即可,版本會自動指定為上面的2.5.0版本:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

在依賴關係管理<dependencyManagement>中透過新增帶有 scope=import 的 spring-boot-dependencies 工件來進行依賴項管理

Spring Boot 提供父 POM,以便更輕鬆地建立 Spring Boot 應用程式。
但是,如果我們已經有父 POM 可以繼承,則使用父 POM 可能並不總是可取的。在實踐中,我們可能會受到設計規則或其他偏好的限制,無法使用不同的父級。如果我們不使用父 POM,我們仍然可以透過新增帶有 scope=import 的spring-boot-dependencies 工件來從依賴項管理中受益:

<dependencyManagement>
     <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.5.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

如需建立SpringWeb模組的SpringBoot,同理:

<dependencies>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

另一方面,如果沒有父 POM,我們將不再受益於外掛管理。 這意味著我們需要顯式新增spring-boot-maven-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Maven中依賴優先順序關係

在 Maven 中,依賴項的版本解析遵循以下優先順序:

  1. 專案內宣告的依賴項版本具有最高優先順序,即在專案 pom.xml 檔案中直接宣告的依賴項。
  2. 如果專案內沒有宣告依賴項版本,但在父專案的 dependencyManagement 標籤中宣告瞭版本,那麼這個版本將被使用。
  3. 如果專案和父專案都沒有宣告依賴項版本,但是在 Maven 中心倉庫中存在一個預設版本,那麼將會使用這個版本。
  4. 如果上述情況都不符合,那麼 Maven 將會嘗試解析最新版本的依賴項。

參考文獻:

  • https://www.kancloud.cn/hanxuming/java001/3167494
  • https://www.baeldung.com/spring-boot-dependency-management-custom-parent;
  • https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

相關文章