Micronaut AWS Lambda部署提示找不到MicronautLambdaHandler类求助
问题根因排查
首先明确:19.2MB的部署包不会触发该问题,AWS Lambda直接上传zip包的大小限制为50MB,通过S3部署的限制为10GB,你的包大小远低于阈值,不用考虑大小问题。
你遇到的类找不到报错但解压后类存在,属于类加载阶段的配置异常,按以下顺序排查修复即可:
1. 修复依赖版本不兼容问题
你当前使用的Micronaut核心依赖版本为2.5.12,而Micronaut AWS相关依赖版本为2.9.0,跨小版本的依赖会导致SPI服务注册和类加载逻辑不匹配,将所有Micronaut生态的依赖版本统一即可,例如把micronaut-function-aws-api-proxy、micronaut-aws-sdk-v2的版本调整为2.5.x系列的兼容版本。
2. 补全Shadow插件的打包配置
你没有在提供的配置中声明Shadow插件的配置,这是最常见的踩坑点:
- 首先确认你已在build.gradle开头引入正确版本的Shadow插件,Gradle 7.x对应的配置为:
plugins { id 'io.micronaut.application' version '2.0.8' id 'com.github.johnrengelman.shadow' version '7.1.2' id 'java' }
- 其次必须添加Shadow包的服务文件合并配置,否则Micronaut的SPI注册文件会被覆盖,导致类加载失败:
shadowJar { // 合并所有服务提供者配置文件 mergeServiceFiles() // 合并Micronaut专属的服务定义文件 transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { paths = ['META-INF/micronaut/io.micronaut.core.io.service.ServiceDefinition'] } }
3. 使用正确的打包命令
不要使用./gradlew assemble生成普通构建包,要执行专门的Shadow打包命令:./gradlew shadowJar
生成的部署包在build/libs目录下,文件名带有-all后缀,上传这个包即可。
4. 检查Lambda运行时配置
确认Lambda控制台的运行时配置和你打包使用的JDK版本一致,例如你用JDK11打包就要选Java 11 (Corretto)运行时,不要选择其他语言运行时或者GraalVM原生运行时(除非你专门打的是原生镜像包)。
5. 验证打包结构
解压最终上传的shadow包,确认类文件直接存放在包的根目录下,路径为io/micronaut/function/aws/proxy/MicronautLambdaHandler.class,如果所有类都存放在BOOT-INF/classes目录下,说明你用了错误的Spring Boot式打包插件,替换为Micronaut官方的Shadow打包配置即可。
内容的提问来源于stack exchange,提问作者Ravi

