理解spring-boot-starter-parent

weixin_33860722發表於2018-12-23

理解spring-boot-starter-parent

通過spring initializr,我們可以快速構建一個springboot應用,如果你選擇的是Maven來管理專案,在預設的pom檔案中有這麼一個section:

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

它表示當前pom檔案從spring-boot-starter-parent繼承下來,在spring-boot-starter-parent中提供了很多預設的配置,這些配置可以大大簡化我們的開發。

Parent Poms Features

通過繼承spring-boot-starter-parent,預設具備瞭如下功能:

  1. Java版本(Java8)
  2. 原始碼的檔案編碼方式(UTF-8)
  3. 依賴管理
  4. 打包支援
  5. 動態識別資源
  6. 識別外掛配置
  7. 識別不同的配置,如:application-dev.properties 和 application-dev.yml

以上繼承來的特性有的並非直接繼承自spring-boot-starter-parent,而是繼承自spring-boot-starter-parent的父級spring-boot-dependencies

需要特別說明的是,application-dev.properties 和 application-dev.yml支援spring風格的佔位符(${…​}),但是Maven專案把對佔位符的支援改為(@..@),可以通過設定Maven屬性resource.delimiter來重置回去。

繼承spring-boot-starter-parent後,大大簡化了我們的配置,它提供了豐富的常用的預設的依賴的版本定義,我們就不需要再次指定版本號:

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

假設我們需要定製自己的版本號,可以通過下面的方式重寫:

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

不繼承spring-boot-starter-parent構建springboot專案

有時候專案可能有自己的parent poms,Maven只允許定義一個parent pom,這時的專案雖然沒有繼承自spring-boot-starter-parent,但是依賴管理始終需要的,可以通過如下配置引入spring-boot-dependencies的依賴管理功能:

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.0.BUILD-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope> 
        </dependency>
    </dependencies>
</dependencyManagement>

那麼在這種情況下要重寫依賴的版本號就需要用另外的方式:

<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.0.BUILD-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

除了依賴管理,打包也是需要的:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>1.4.0.RELEASE</version>
      <configuration>
        <executable>true</executable>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

增加以上配置後就可以使用熟悉的mvn pacakge成一個jar了。