Spring Initializr 有什麼新功能

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

產生 Spring Boot 專案最快的方式是透過 start.spring.io。該網站提供一個精選的相依性清單,您可以根據選定的 Spring Boot 版本將其添加到您的應用程式。您還可以為專案選擇語言、建置系統和 JVM 版本。多年來,start.spring.io 作為產生 Spring 專案工具的普及率呈指數級增長,每年透過該網站產生數百萬個專案。

在過去的幾個月裡,我們一直在努力徹底修改專案產生 API。為了更好地理解其背後的動機,請看下面的專案結構:Old Structure

  • 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 中的自動設定),而無需對函式庫進行任何變更。

作為重構的一部分,我們也改進了專案結構。New Structure

頂層概念(例如 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 社群中所有即將舉辦的活動。

查看全部