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 社区中所有即将举行的活动。

查看全部