领先一步
VMware 提供培训和认证,助您加速进步。
了解更多如果你观看了Netflix的Taylor Wicksell在SpringOne Platform上的主题演讲,你一定会对他们工程团队惊人的生产力感到震撼。去年,超过300个基于Spring的应用投入生产——这是一项了不起的成就。
在Netflix,Taylor和他的Java平台团队负责Java开发者的体验(DevEx)。Taylor团队只有一个使命:帮助Netflix的工程师保持高生产力——以极快的速度交付高质量的代码。这个使命显然已经取得了成功。

泰勒生产力秘诀清单中的首位是应用程序生成器。Netflix 发现,当开发者所需的一切都唾手可及,可以立即开始时,他们采用平台的速度会更快。应用程序生成器通过提供有用的引导,减少重复劳动,减轻开发者的负担,帮助他们快速启动。应用程序生成器还鼓励针对常见问题采取通用方法——如果您有许多团队同时创建微服务,这一点尤其有用。
泰勒清单中排名靠前的还有简化对重要库的访问。每个企业都有自己的库——它们依赖这些库来简化任务或处理底层细节。这些库非常重要,通常包含专有的业务逻辑,这些逻辑既是私有的又是独特的。应用程序生成器可以帮助开发者轻松访问这些库,而无需深入研究文档、浏览 Wiki 或在 Maven 存储库中搜索。
是的。您可能已经在使用应用程序生成器了。我能想到的最好的例子是 start.spring.io,也称为“Spring Initializr”(尽管也存在其他,例如 .Net 应用程序的这个)。
Spring Initializr 可以轻松生成 Spring Boot 应用程序。它成功的秘诀并非秘密:它极其易于使用。您可以在 浏览器中使用它,或直接在 IDE 中使用。您甚至可以通过 cURL 或 HTTPie 从命令行使用它,或者通过 Spring Boot CLI 工具使用它。
如何做?当然是使用 Spring!甚至还有一个库可以做到这一点。这个库也叫做 Spring Initializr。它是驱动 start.spring.io 的核心库,并且非常容易定制。在本文的其余部分,我们将逐步介绍创建自己的定制 Initializr 所需的步骤。
为了模拟您在企业中的操作,本教程将限制一些应用程序生成选项,并包含一些常规 Spring Initializr 不提供的第三方库,即 Axon CQRS 和事件溯源框架。我们将把我们的项目称为“Axon Initializr”。
本教程的完整代码可以在 GitHub 上找到。
冒着有点递归的风险,我们可以使用 start.spring.io 网站来开始构建我们的自定义 Axon Initializr!
使用该网站,创建一个具有以下屏幕截图所示设置的项目。使用最新 GA 版本的 Spring Boot,并确保包含 “web” 依赖项。我们正在构建一个 RESTful Web 服务,因此需要这些库。

点击绿色的“Generate”按钮将项目作为 Zip 文件下载。解压 Zip 文件,并在 IDE 或文本编辑器中打开生成的项目文件夹。现在,我们可以开始构建我们的自定义 axon-initializr 项目了。
我们需要在 Maven 的 pom.xml 中添加几个条目,以便将 Spring Initializr 库包含在我们的项目中。在 POM 中,添加一个 Spring Initializr 的 dependencyManagement 条目,如下所示
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-bom</artifactId>
<version>0.8.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
接下来,在 POM 的现有 <dependencies> 部分添加几个额外的 Spring Initializr 依赖项
<!-- Existing dependencies omitted here -->
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-web</artifactId>
</dependency>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-generator-spring</artifactId>
</dependency>
initializr-web 依赖项引入了预定义的应用程序生成端点,IDE 可以与之通信,而 initializr-generator-spring 引入了关于如何构建 Spring Boot 项目的预设规则(这是我们想要的)。现在我们准备好定制 Axon Initializr 了。
Spring Initializr 库可以根据各种不同的选择(语言、构建工具等)生成应用程序项目。然而,在您的企业中,限制这些选择可能是明智的。这样,您可以鼓励某些方法。(这些就是前面提到的引导。)例如,您的企业可能有一个首选的数据库或消息平台,因此如果您提供其他选择,将会使事情复杂化。
我们使用 application.yaml 文件配置我们的 Axon Initializr。在我们的 axon-initializr 项目中,将 src/main/resources/application.properties 文件重命名为 application.yaml。然后,通过添加以下 YAML 配置来自定义
initializr:
name:
value: axon
description:
value: 'An Axon Framework Sample Application'
group-id:
value: com.benwilcock
artifact-id:
value: axon-app
javaVersions:
- id: 11
default: false
- id: 1.8
default: true
languages:
- name: Java
id: java
default: true
- name: Kotlin
id: kotlin
default: false
packagings:
- name: Jar
id: jar
default: true
types:
- name: Maven Project
id: maven-project
description: Generate a Maven-based project archive
tags:
build: maven
format: project
default: true
action: /starter.zip
这些“initializr:”参数通过指定可用选项来配置我们的应用程序生成器
您会注意到某些项目上设置了 default: true。当未做出选择时,此设置会自动提升我们首选的选项。
让我们做一个简单的测试,以确保我们走在正确的轨道上。首先,使用以下命令构建并运行新的 initializr 项目
./mvnw package spring-boot:run
然后,在另一个终端中,使用 cURL 访问 initializr 帮助
curl https://:8080
您的终端窗口中的输出应与下面的屏幕截图相似

这证实了 axon-initializr 已按预期启动并集成了所需的 Spring Initializr 库。但它尚未准备好开始生成 Spring 或 Axon 应用程序。在第一个终端窗口中使用 Ctrl-C 停止 axon-initializr,然后我们将继续进行自定义。
添加常规 Spring 库很容易。我们只需在 YAML 配置的 dependencies: 列表中为每个库创建一个条目。缺点是:YAML 非常冗长。我只在这里展示一个 Spring Web 项目的条目作为开始。(其余的 在 GitHub 上。)
依赖项条目以 name 开始,后跟一个 content 项目列表。在下面的示例中,您将看到 Web 依赖项组,然后是 Spring Web 的条目
initializr:
#...(omitted the previous stuff here to save space)
dependencies:
- name: Web
content:
- name: Spring Web
id: web
description: Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.
facets:
- web
- json
links:
- rel: guide
href: https://springjava.cn/guides/gs/rest-service/
description: Building a RESTful Web Service
- rel: reference
href: https://docs.springjava.cn/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-developing-web-applications
- rel: guide
href: https://springjava.cn/guides/gs/serving-web-content/
description: Serving Web Content with Spring MVC
- rel: guide
href: https://springjava.cn/guides/tutorials/bookmarks/
description: Building REST services with Spring
您可以从 此示例 YAML 文件中复制您喜欢的任何其他 Spring 相关条目,该文件来自 start.spring.io 的配置。
这是最后的配置步骤!对于我们的 Axon Initializr,我们需要添加自定义的 Axon 库。为简洁起见,我只在此添加一个 Axon 库作为示例。但是,在自定义您的 initializr 时,您可以添加任意数量的条目。
initializr:
dependencies:
#...(omitted the existing libraries here to save space)
- name: Axon Tools
content:
- name: Axon Framework
id: axon-starter
groupId: org.axonframework
artifactId: axon-spring-boot-starter
version: 4.2
description: Brings first-class support for CQRS, Event Sourcing, and DDD to SpringBoot including Commands, Queries, Aggregates, Events, Event Handlers, and more...
links:
- rel: axon
href: https://github.com/AxonFramework
description: The open-source code repository on GitHub
- rel: docs
href: https://docs.axoniq.io/reference-guide/
description: The reference guide on how to use Axon
- rel: video-guide
href: https://www.youtube.com/watch?v=tqn9p8Duy54&list=PL4O1nDpoa5KQkkApGXjKi3rzUW3II5pjm
description: A full getting started video tutorial for Axon (YouTube).
您可能会注意到此配置与第 4 步中的配置不同。这是因为我们明确列出了每个库的 Maven 坐标(groupId、artifactId 和 version)。我们这样做是因为 Axon 框架库在 Spring 之外,所以我们需要明确说明。
这里的示例只是代码片段。您可以在 GitHub 上查看完整的 axon-initializr YAML 配置。
现在我们已经将所需的配置和自定义添加到 axon-initializr 项目中,是时候在 IDE 中使用它来生成 Axon 应用程序了。
我将使用 IntelliJ IDEA Ultimate Edition 作为我的 IDE,但使用 Eclipse、Spring Tools、NetBeans 或 Visual Studio Code 也可以轻松实现同样流畅的开发工作流程。
首先,在终端中启动 axon-initializr 服务
./mvnw clean package spring-boot:run
然后,启动 IntelliJ IDEA 并选择 File → New → Project...,在下一个屏幕上,在左侧面板中选择 Spring Initializr 作为新项目类型。然后,在中间面板中将服务终端 URL 更改为 https://:8080,如下所示

当您点击“Next”时,您可以开始自定义您的新 Axon 应用程序。我们标准化工作的努力已经开始见效;默认项目名称、group id、artifact id、package、packaging、language、java 版本和描述都来自 Axon Initializr 中 application.yaml 的默认设置。

最后,再次点击“Next”后,我们可以配置我们(尚未生成)的 Axon 应用程序项目。
我们首先从 Axon Initializr 的精选列表中添加所需的依赖项。在下面的屏幕截图中,您可以看到,除了各种标准的 Spring 库,如 Spring Data JPA 和 Spring for RabbitMQ(如果您添加了它们),我们还可以选择自定义库,如 Axon Framework。所有这些都无缝运行,将我们首选的 Spring 库与自定义的 Axon 库混合在一起。

就这样,我们完成了。在 IntelliJ IDEA 中设置了一些其他项目(例如生成应用程序的文件夹)后,最后一次点击“Next”按钮将创建我们的新 Axon 应用程序项目,并直接将我们带入 IDE。从那里,我们可以开始处理我们的 CQRS 应用程序,添加 Commands、Queries、Events 和 Aggregates。
正如您所见,使用 Spring Initializr 作为基础创建自定义应用程序生成器非常容易,并且它极大地改善了我们的开发体验。通过添加您喜欢的库和其他自定义设置,您可以轻松地让开发人员“做正确的事”,并给他们一些每个人都想要的东西——更多时间来处理真正重要的事情!
我只是触及了 Spring Initializr 定制可能性的表面。要了解更多关于其他许多自定义选项的信息,请查看 官方文档。最后,别忘了伴随本教程的代码可以在 GitHub 上找到。
本文最初发表于 pivotal.io