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 的問題在於,對於任何想要自定義專案生成的人來說,唯一可行的方法是 fork 該庫並擴充套件或修改 ProjectGenerator 類。這使得開發體驗相當笨拙。

新的專案生成 API

新 API 的主要目標是允許在不 fork 庫的情況下自定義生成的專案。為了允許對專案各個方面做出貢獻,每個方面都有一個抽象。這些包括:

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

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

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

該庫提供了幾個條件,以便可以根據請求的專案應用定製器。下面的示例說明了如何調整 Gradle 構建,在請求 war 打包時應用 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 依賴項生成的,則構建將使用 Asciidoctor 外掛和 BuildCustomizer 進行配置。

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 社群所有即將舉行的活動。

檢視所有