// Add to module-info.java
requires io.netty.transport.classes.kqueue;
requires io.netty.transport.kqueue.osx.aarch_64;
模块化 Vert.x 指南
从 Vert.x 5 开始,Vert.x 支持使用 Vert.x 栈构建模块化应用和服务。
本文旨在指导开发者如何使用 Vert.x 构建和运行模块化应用。
成熟度模型
Vert.x 致力于提供最成熟的 JPMS 级别支持(参见 https://nipafx.dev/java-modules-jpms-maturity-model/)。
大多数 Vert.x 组件支持级别 3(根据成熟度模型)和显式模块,然而少数模块由于限制而未能实现完全的模块化,这通常是由于错误的依赖关系(例如,拆分包)造成的。
原生传输
支持原生传输。
模块 io.netty.transport.classes.${native.detected.transport}
是必需的,因为它包含传输类。
模块 io.netty.transport.${native.transport}.${os.name}.${os.detected.arch}
包含原生库,其存在仅在运行时需要。
您可以通过 JVM 启动命令 --add-modules --add-modules io.netty.transport.classes.${native.transport},io.netty.transport.${native.transport}.${os.detected.name}.${os.detected.arch}
添加它们。
或者,您也可以将它们添加到您的模块描述符中(即使您的应用程序不使用它们),这通常会触发工具在运行时自动添加它们,但这会将您的模块绑定到特定的操作系统/架构。
您可以在 Vert.x JPMS 示例中找到一个OpenSSL 示例。
OpenSSL
支持 OpenSSL。
模块 io.netty.tcnative.classes.openssl
是必需的,因为它包含 OpenSSL Netty 类。
模块 io.netty.internal.tcnative.openssl.${os.detected.name}.${os.detected.arch}
包含原生库,其存在仅在运行时需要。
您可以通过 JVM 启动命令 --add-modules io.netty.transport.classes.${native.transport},io.netty.transport.${native.transport}.${os.detected.name}.${os.detected.arch}
添加它们。
或者,您也可以将它们添加到您的模块描述符中(即使您的应用程序不使用它们),这通常会触发工具在运行时自动添加它们,但这会将您的模块绑定到特定的操作系统/架构。
// Add to your module-info.java
requires io.netty.tcnative.classes.openssl;
requires io.netty.internal.tcnative.openssl.osx.aarch_64;
您可以在 Vert.x JPMS 示例中找到一个OpenSSL 示例。
HTTP 压缩
Vert.x 开箱即用支持 gzip 和 deflate 算法,但是 brotli 和 zstd 算法分别需要您添加以下依赖项:
-
Brotli:
com.aayushatharva.brotli4j:brotli4j
-
Zstd:
com.github.luben:zstd-jni
这些依赖项是可选的,因为并非所有人都需要它们,并且在使用时,它们是运行时而非编译时必需的。
您可以通过 JVM 启动命令 --add-modules com.aayushatharva.brotli4j,com.github.luben.zstd_jni
添加它们。
或者,您也可以将它们添加到您的模块描述符中(即使您的应用程序不使用它们),这通常会触发工具在运行时自动添加它们。
// Add to your module-info.java
requires com.aayushatharva.brotli4j;
requires com.github.luben.zstd_jni;
您可以在 Vert.x JPMS 示例中找到一个Brotli 示例。
代码生成
支持模块化应用的生成代码。
以下模块可用于应用程序:
Artifact ID | 模块名 | 描述 |
vertx-codegen-api |
| 代码生成注解,例如 |
vertx-codegen-json |
| JSON 生成器 API,例如 |
您的应用程序需要在模块路径中包含这些组件。
Vert.x 4 的 vertx-codegen
组件已拆分为:
-
vertx-codegen-processor
仅包含 Java 编译器所需的注解处理器 -
vertx-codegen-api
包含注解 -
vertx-codegen-json
包含 JSON 生成器
vertx-codegen
仍为向后兼容目的而存在,您可以随意使用它或使用更细粒度的依赖项。
组件
核心
Artifact ID | 模块名 | 依赖项 |
---|---|---|
vertx-core |
| 显式 |
vertx-core-logging |
| 显式 |
您的应用程序不应直接依赖 io.vertx.core.logging ,此模块包含 Vert.x 用于日志记录的抽象,并且仅供 Vert.x 组件内部使用。您的应用程序应使用您选择的日志框架并配置 Vert.x 日志以使用它。 |
认证
Artifact ID | 模块名 | 依赖项 |
---|---|---|
vertx-auth-common |
| 显式 |
vertx-auth-htpasswd |
| 显式 |
vertx-auth-abac |
| 显式 |
vertx-auth-ldap |
| 显式 |
vertx-auth-sqlclient |
| 显式 |
vertx-auth-oauth2 |
| 显式 |
vertx-auth-htdigest |
| 显式 |
vertx-auth-jwt |
| 显式 |
vertx-auth-properties |
| 显式 |
vertx-auth-webauthn4j |
| 显式 |
vertx-core-otp |
| 显式 |
依赖项
传递性依赖项是显式模块。
服务解析器
Artifact ID | 模块名 | 依赖项 |
vertx-service-resolver |
| 显式 |
URI 模板
Artifact ID | 模块名 | 依赖项 |
vertx-uri-template |
| 显式 |
Web
Artifact ID | 模块名 | 依赖项 |
---|---|---|
vertx-web-common |
| 显式 |
vertx-web |
| 显式 |
vertx-web-openapi-router |
| 显式 |
vertx-web-validation |
| 显式 |
vertx-web-proxy |
| 显式 |
vertx-web-graphql |
| 自动 |
vertx-web-client |
| 显式 |
vertx-web-sstore-redis |
| 显式 |
vertx-web-sstore-cookie |
| 显式 |
vertx-web-api-service |
| 显式 |
vertx-web-template-mvel |
| 自动 |
vertx-web-template-freemarker |
| 自动 |
vertx-web-template-thymeleaf |
| 自动 |
vertx-web-template-rocker |
| 自动 |
vertx-web-template-handlebars |
| 自动 |
vertx-web-template-jte |
| 自动 |
以下模板引擎目前不支持模块化:
-
vertx-web-template-httl
-
vertx-web-template-pebble
-
vertx-web-template-pug
-
vertx-web-template-rythm
SQL 客户端
Artifact ID | 模块名 | 依赖项 |
vertx-sql-client |
| 显式 |
vertx-pg-client |
| 显式 |
vertx-mssql-client |
| 显式 |
vertx-mysql-client |
| 显式 |
vertx-pg-client |
| 显式 |
vertx-oracle-client |
| 自动 |
vertx-jdbc-client |
| 依赖 JDBC 库 |
Redis 客户端
Artifact ID | 模块名 | 依赖项 |
vertx-redis-client |
| 显式 |
邮件客户端
Artifact ID | 模块名 | 依赖项 |
vertx-mail-client |
| 显式 |
Cassandra 客户端
Artifact ID | 模块名 | 依赖项 |
vertx-cassandra-client |
| 自动 |
Consul 客户端
Artifact ID | 模块名 | 依赖项 |
vertx-consul-client |
| 显式 |
AMQP 客户端
Artifact ID | 模块名 | 依赖项 |
vertx-amqp-client |
| 显式 |
Mongo 客户端
Artifact ID | 模块名 | 依赖项 |
vertx-mongo-client |
| 自动 |
Stomp
Artifact ID | 模块名 | 依赖项 |
vertx-stomp |
| 显式 |
熔断器
Artifact ID | 模块名 | 依赖项 |
vertx-circuit-breaker |
| 显式 |
健康检查
Artifact ID | 模块名 | 依赖项 |
vertx-health-checks |
| 显式 |
配置
Artifact ID | 模块名 | 依赖项 |
vertx-config |
| 显式 |
vertx-config-git |
| 自动 |
vertx-config-hocon |
| 自动 |
vertx-config-configmap |
| 显式 |
vertx-config-spring |
| 显式 |
vertx-config-yaml |
| 显式 |
vertx-config-consul |
| 显式 |
vertx-config-redis |
| 显式 |
JSON Schema
Artifact ID | 模块名 | 依赖项 |
vertx-json-schema |
| 显式 |
Open API
Artifact ID | 模块名 | 依赖项 |
vertx-open-api |
| 显式 |
MQTT
Artifact ID | 模块名 | 依赖项 |
vertx-mqtt |
| 显式 |
gRPC
Artifact ID | 模块名 | 依赖项 |
vertx-grpc-common |
| 自动 |
vertx-grpc-client |
| 自动 |
vertx-grpc-server |
| 自动 |
以下模块不支持模块化:
-
vertx-grpcio-common
-
vertx-grpcio-client
-
vertx-grpcio-server
从 Vert.x 5 开始,Vert.x gRPC 栈分为两部分:
-
vertx-grpc-\*
构件提供显式模块,但依赖于名为com.google.protobuf
和com.google.protobuf.util
的自动模块。 -
vertx-grpc-io-*
构件不能模块化,依赖于非模块化的io.grpc:*
构件。
关于 com.google.protobuf.*
构件,在 Java Protocol Buffers 库支持模块化之前,JPMS Attic Repository 中有一个模块化版本。这里有一个模块化 gRPC 服务的示例。
JUnit 5
Artifact ID | 模块名 | 依赖项 |
vertx-junit5 |
| 显式 |
Vert.x 示例提供了一些使用 JUnit 5 编写的简单测试示例。
指标
Micrometer 指标
Artifact ID | 模块名 | 依赖项 |
vertx-micrometer-metrics |
| 自动 |
Dropwizard 指标
Artifact ID | 模块名 | 依赖项 |
vertx-dropwizard-metrics |
| 自动 |
跟踪
Zipkin 跟踪
Artifact ID | 模块名 | 依赖项 |
vertx-zipkin |
| 自动 |
OpenTelemetry 跟踪
Artifact ID | 模块名 | 依赖项 |
vertx-opentelemetry |
| 自动 |
Hazelcast 集群
Artifact ID | 模块名 | 依赖项 |
vertx-hazelcast |
| 显式 |
macOS 上模块路径不支持组播加入,需要使用 Hazelcast TCP 配置。 |
HTTP 代理
Artifact ID | 模块名 | 依赖项 |
vertx-http-proxy |
| 显式 |