Spring Initializr 的新特性

工程 | Madhura Bhave | 2019年2月20日 | ...

生成 Spring Boot 專案最快的方式是透過 start.spring.io。該網站提供了一個精選的依賴列表,您可以根據所選的 Spring Boot 版本將其新增到您的應用程式中。您還可以選擇專案的語言、構建系統和 JVM 版本。多年來,start.spring.io 作為生成 Spring 專案的工具,其受歡迎程度呈指數級增長,每年都有數百萬個專案透過該網站生成。

在過去的幾個月裡,我們一直在對專案生成 API 進行全面改革。為了更好地理解其背後的動機,請看下面的專案結構:舊結構

  • initializr-generator 是包含專案生成 API 核心的庫。
  • initializr-web 包含 REST 端點以及與 Web UI 相關的所有內容。
  • initializr-site 包含 start.spring.io 上可用的所有定製。

現有 API 的問題在於,對於任何想要定製專案生成的人來說,唯一合理的方法是分叉庫並擴充套件或修改 ProjectGenerator 類。這導致了相當笨拙的開發者體驗。

新的專案生成 API

新 API 的主要目標是在不分叉庫的情況下允許定製生成的專案。為了實現專案各方面的貢獻模型,我們為每個方面提供了抽象。這些抽象包括

  • 一個包含 Maven 和 Gradle 實現的構建抽象,允許定製構建檔案
  • 一個包含 Java、Groovy 和 Kotlin 實現的語言抽象
  • 一個更高階的文字資源、.gitignore 和基本配置檔案模型

這些抽象通過幾個鉤子點提供,您可以使用它們來定製專案資產

  • BuildCustomizer 用於新增依賴、外掛或其他配置項
  • 原始檔定製器用於向專案添加註解、方法或額外的類
  • ProjectContributor,一個用於向目錄結構新增資產的高階鉤子點

該庫提供了多種條件,以便可以根據請求的專案應用定製器。以下示例說明了如何在請求 war 打包時,調整 Gradle 構建以應用 war 外掛

@Bean
@ConditionalOnPackaging(WarPackaging.ID)
public BuildCustomizer<GradleBuild> warPluginContributor() {
    return (build) -> build.addPlugin("war");
}

其思想是定製器可以在外部模組中定義(有點類似於 Spring Boot 中的自動配置),而無需修改庫。

作為重構的一部分,我們還改進了專案結構。新結構

ProjectContributorBuildCustomizer 等頂層概念位於 initializr-generator 中。該模組還包含了實際生成專案所需的最少基礎設施。initializr-generator-spring 為我們希望為 Spring 專案生成的專案結構提供了貢獻者。此外,程式碼現在在 GitHub 上拆分到兩個倉庫中,一個用於,另一個用於start-site,它代表了我們在 start.spring.io 上的生產例項。

start.spring.io 的新特性

新的專案生成 API 使我們能夠輕鬆地向 start.spring.io 新增許多功能。我們今天已經合併了這些功能,所以您可以立即使用它們。

幫助文件

生成本專案現在在專案根目錄中包含一個 HELP.md 檔案。該檔案根據應用程式中存在的依賴項進行定製。目前,它包含指向與所選依賴項相關的指南和參考文件的連結。將來,我們計劃進一步定製 HELP.md 檔案,以提供有助於您開發應用程式的後續步驟。

Spring Rest Docs 構建配置

如果專案使用 restdocs 依賴項生成,則使用 BuildCustomizer 配置構建以應用 Asciidoctor 外掛。

為 Flyway 自動生成目錄結構

對於使用 Flyway 生成的專案,現在會自動建立 src/main/resources/db/migration 目錄。為了說明使用此 API 實現這一點有多容易,這裡是該功能的貢獻者程式碼

@Bean
@ConditionalOnRequestedDependency("flyway")
public ProjectContributor flywayProjectContributor() {
  return (directory) -> {
     Path migrationDirectory = directory
           .resolve("src/main/resources/db/migration");
     Files.createDirectories(migrationDirectory);
  };
}

即將推出

我們對新 API 的潛力才剛剛開始探索,我們希望在帶來新功能的同時,平衡提升開發者體驗和保持非侵入性修改之間的關係。

通常,我們希望為 HELP.md 帶來更多內容,根據所選依賴項提供專門提示,更重要的是,根據您可能選擇的依賴項提供提示,以便您瞭解可能尚未了解的內容。

我們還在開發 start.spring.io 的新 Web UI,以及幫助您擴充套件應用程式的方法,敬請關注!

訂閱 Spring 通訊

透過 Spring 通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助力您加速進步。

瞭解更多

獲取支援

Tanzu Spring 透過一份簡單的訂閱,為 OpenJDK™、Spring 和 Apache Tomcat® 提供支援和二進位制檔案。

瞭解更多

近期活動

檢視 Spring 社群的所有近期活動。

檢視全部