
升级到 Micronaut 4 后,共享库中定义的 @Endpoint 类(如 PingEndpoint)无法被自动发现和注册,根本原因是 Micronaut 4 的编译时元数据机制不兼容旧版字节码,必须重新编译共享库。
升级到 micronaut 4 后,共享库中定义的 `@endpoint` 类(如 `pingendpoint`)无法被自动发现和注册,根本原因是 micronaut 4 的编译时元数据机制不兼容旧版字节码,必须重新编译共享库。
Micronaut 4 对注解处理器和运行时 Bean 发现机制进行了深度重构,尤其强化了对编译期生成的 META-INF/micronaut/ 元数据文件的依赖。与 Micronaut 3 不同,Micronaut 4 不再兼容由 Micronaut 3 编译器生成的字节码元数据——即使类结构未变,只要共享库仍使用 Micronaut 3.x 的 micronaut-inject-java 或 micronaut-core 进行编译,其 @Endpoint、@Controller 等声明就不会被 Micronaut 4 的 DefaultRouteBuilder 识别。
✅ 正确做法是:将共享库整体升级至 Micronaut 4,并使用 Micronaut 4 对应的工具链重新编译发布。例如,在共享库的 build.gradle 中:
plugins {
id("io.micronaut.application") version "4.12.0" apply false
id("io.micronaut.library") version "4.12.0" apply true // 使用 library 插件
}
dependencies {
implementation("io.micronaut:micronaut-http-server-netty")
implementation("io.micronaut:micronaut-management") // 若含 @Endpoint
}同时确保共享库的 src/main/java 中的 @Endpoint 类保持语义正确(Micronaut 4 中 @Endpoint 仍有效,但需配合 micronaut-management 模块):
@Endpoint(id = "ping", defaultSensitive = false)
public class PingEndpoint {
@Read
public String ping() {
return "pong";
}
}⚠️ 注意事项:
- 仅升级主应用而忽略共享库的编译环境,会导致
@Endpoint“静默失效”(无报错,但路由不注册); - 共享库若发布为 Maven artifact,必须发布 全新版本(如
1.2.0-mn4),避免与 Micronaut 3 兼容版本混淆; - 可通过检查 JAR 包内是否存在
META-INF/micronaut/endpoint-spi.xml或routes.xml等文件,验证编译是否成功生成 Micronaut 4 元数据; - 若共享库还包含自定义
BeanDefinition或RouteBuilder扩展,也需同步适配 Micronaut 4 的 SPI 接口变更。
简言之:Micronaut 4 的 Bean 发现是“编译时契约驱动”的,跨大版本的二进制兼容性不成立。重编译不是可选项,而是强制前提。















