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 社区的所有近期活动。

查看全部