// 添加到 module-info.java
requires io.netty.transport.classes.kqueue;
requires io.netty.transport.kqueue.osx.aarch_64;
Vert.x 模块化指南 (JPMS)
从 5 版本开始,Vert.x 全面支持利用 Vert.x 技术栈构建与运行基于 Java 平台模块系统 (JPMS) 的模块化应用程序与微服务。
本文档旨在指导开发者如何基于 Vert.x 构建、打包与运行模块化 Java 应用。
核心概念与定义
我们在本文中沿用 JPMS 规范术语清单 中的标准定义:
-
命名模块(Named module)
-
显式模块(Explicit module)
-
自动模块(Automatic module)
JPMS 成熟度模型
Vert.x 致力于提供最高级别的 JPMS 规范支持(参见 Java 模块成熟度模型)。
绝大多数 Vert.x 核心组件均达到了成熟度 Level 3 标准,并提供了完整的显式模块描述符(module-info)。仅有极少数第三方适配模块因上游传递依赖包拆分(Split Package)等客观限制被暂时归为自动模块。
原生网络传输 (Native Transports)
Vert.x 模块化体系完整支持 Netty 原生传输层(如 Linux epoll、macOS kqueue、io_uring)。
模块 io.netty.transport.classes.${native.detected.transport} 是编译时必需依赖,因为它包含了具体的传输抽象类。
而模块 io.netty.transport.${native.transport}.${os.name}.${os.detected.arch} 包含原生 C 共享动态链接库,仅在运行时需要。
你可以在 JVM 启动命令中添加参数:--add-modules io.netty.transport.classes.${native.transport},io.netty.transport.${native.transport}.${os.detected.name}.${os.detected.arch}。
或者,你也可以直接将它们声明进自己的模块描述符中(即使你的应用代码本身未显式直接调用它们)。这通常会促使构建工具在运行时自动引入它们,不过这会将你的模块绑定到特定的操作系统/CPU 架构:
你可以在 Vert.x 示例集合中参考 原生传输与 OpenSSL 模块化示例。
OpenSSL 支持
Vert.x 模块化体系支持 OpenSSL 硬件加速。
模块 io.netty.tcnative.classes.openssl 是必需的编译时模块,包含了 OpenSSL Netty 桥接类。
模块 io.netty.internal.tcnative.openssl.${os.detected.name}.${os.detected.arch} 包含具体的原生二进制文件,仅在运行时需要。
在 JVM 启动参数中引入:--add-modules io.netty.tcnative.classes.openssl,io.netty.internal.tcnative.openssl.${os.detected.name}.${os.detected.arch}。
或者在 module-info.java 中显式声明:
// 添加到 module-info.java
requires io.netty.tcnative.classes.openssl;
requires io.netty.internal.tcnative.openssl.osx.aarch_64;
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。
或在 module-info.java 中添加声明:
requires com.aayushatharva.brotli4j;
requires com.github.luben.zstd_jni;
代码生成 (Code Generation)
在模块化应用程序中完全支持 Vert.x 代码生成体系。
可供应用使用的模块清单如下:
Artifact ID |
模块名称 (Module Name) |
说明 |
vertx-codegen-api |
|
Codegen 核心注解(例如 |
vertx-codegen-json |
|
JSON 生成器 API(例如 |
你的应用程序需要在 Module Path 模块路径上引入这些组件。
原 Vert.x 4 中的 vertx-codegen 组件现已细粒度拆分为:
-
vertx-codegen-processor:仅在 Java 编译器阶段必需的注解处理器; -
vertx-codegen-api:核心契约注解; -
vertx-codegen-json:JSON 数据转换生成器。
出于向后兼容考虑,传统的 vertx-codegen 仍然保留,开发者既可继续沿用,也可选择引入粒度更精细的独立依赖。
服务代理代码生成
为模块生成 Service Proxy 所需的最小模块声明如下:
// Service proxy 服务代理依赖声明
requires static io.vertx.codegen.api;
requires static io.vertx.codegen.json;
SQL Client Template 代码生成
生成 SQL Client Template 所需的最小模块声明:
requires static io.vertx.codegen.api;
requires io.vertx.sql.client;
requires io.vertx.sql.client.templates;
官方组件模块清单
核心组件 (Core)
Artifact ID |
模块名称 (Module Name) |
依赖性质 |
vertx-core |
|
显式模块 (explicit) |
vertx-core-logging |
|
显式模块 (explicit) |
你的业务应用程序切勿显式 requires io.vertx.core.logging。该模块是 Vert.x 内部专用的日志门面抽象。应用程序应当引入你所偏好的日志实现框架(如 SLF4J、Log4j2),并配置 Vert.x 桥接使用它。
|
核心传递依赖
核心传递依赖均为显式模块:
- Netty 库:io.netty:*
- Jackson 库:com.fasterxml.jackson.core:*
- Apache Log4j 2:org.apache.logging.log4j:*
- SLF4J:org.slf4j:*
认证与鉴权 (Auth)
Artifact ID |
模块名称 (Module Name) |
依赖性质 |
vertx-auth-common |
|
显式模块 (explicit) |
vertx-auth-htpasswd |
|
显式模块 (explicit) |
vertx-auth-abac |
|
显式模块 (explicit) |
vertx-auth-ldap |
|
显式模块 (explicit) |
vertx-auth-sqlclient |
|
显式模块 (explicit) |
vertx-auth-oauth2 |
|
显式模块 (explicit) |
vertx-auth-htdigest |
|
显式模块 (explicit) |
vertx-auth-jwt |
|
显式模块 (explicit) |
vertx-auth-properties |
|
显式模块 (explicit) |
vertx-auth-webauthn4j |
|
显式模块 (explicit) |
vertx-core-otp |
|
显式模块 (explicit) |
服务解析器 (Service Resolver)
Artifact ID |
模块名称 (Module Name) |
依赖性质 |
vertx-service-resolver |
|
显式模块 (explicit) |
URI 模板 (URI Templates)
Artifact ID |
模块名称 (Module Name) |
依赖性质 |
vertx-uri-template |
|
显式模块 (explicit) |
Web 开发套件
Artifact ID |
模块名称 (Module Name) |
依赖性质 |
vertx-web-common |
|
显式模块 (explicit) |
vertx-web |
|
显式模块 (explicit) |
vertx-web-openapi-router |
|
显式模块 (explicit) |
vertx-web-validation |
|
显式模块 (explicit) |
vertx-web-proxy |
|
显式模块 (explicit) |
vertx-web-graphql |
|
自动模块 (automatic) |
vertx-web-client |
|
显式模块 (explicit) |
vertx-web-sstore-redis |
|
显式模块 (explicit) |
vertx-web-sstore-cookie |
|
显式模块 (explicit) |
vertx-web-api-service |
|
显式模块 (explicit) |
响应式 SQL 客户端
Artifact ID |
模块名称 (Module Name) |
依赖性质 |
vertx-sql-client |
|
显式模块 (explicit) |
vertx-pg-client |
|
显式模块 (explicit) |
vertx-mysql-client |
|
显式模块 (explicit) |
vertx-mssql-client |
|
显式模块 (explicit) |
vertx-oracle-client |
|
自动模块 (automatic) |
vertx-jdbc-client |
|
取决于所引入的具体 JDBC 驱动 |
缓存、消息与微服务组件
组件分类 |
Artifact ID |
模块名称 |
依赖性质 |
Redis 客户端 |
vertx-redis-client |
|
显式模块 (explicit) |
邮件客户端 |
vertx-mail-client |
|
显式模块 (explicit) |
Cassandra 客户端 |
vertx-cassandra-client |
|
自动模块 (automatic) |
Consul 客户端 |
vertx-consul-client |
|
显式模块 (explicit) |
AMQP 客户端 |
vertx-amqp-client |
|
显式模块 (explicit) |
MongoDB 客户端 |
vertx-mongo-client |
|
自动模块 (automatic) |
STOMP 协议 |
vertx-stomp |
|
显式模块 (explicit) |
断路器 (Circuit Breaker) |
vertx-circuit-breaker |
|
显式模块 (explicit) |
健康检查 (Health Check) |
vertx-health-checks |
|
显式模块 (explicit) |
配置中心 (Config) |
vertx-config |
|
显式模块 (explicit) |
JSON 校验 (Json Schema) |
vertx-json-schema |
|
显式模块 (explicit) |
OpenAPI 契约路由 |
vertx-open-api |
|
显式模块 (explicit) |
MQTT 协议 |
vertx-mqtt |
|
显式模块 (explicit) |
单元测试 (JUnit 5) |
vertx-junit5 |
|
显式模块 (explicit) |
HTTP 反向代理 |
vertx-http-proxy |
|
显式模块 (explicit) |