Spring Cloud整合AWS Lambda遇MAIN_CLASS未找到问题求助
背景
此前使用Spring Boot 3.0.0 + Java 11,通过Spring Cloud Function创建的AWS Lambda可正常运行。现切换为Spring Boot 3.1.6 + Java 17创建示例函数,已配置对应POM文件、MANIFEST.MF,AWS Handler仍沿用org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest,但函数始终无法被调用。需确认这8个月内调用方式是否存在重大变更。
当前配置信息
AWS Handler配置
org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest
代码结构
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import java.util.function.Function; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean public Function<String,String> capitalize(){return String::toUpperCase;} }
POM配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> <spring-cloud.version>2022.0.4</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-context</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.1.2</version> <configuration> <mainClass>com.example.demo.DemoApplication</mainClass> <image> <builder>paketobuildpacks/builder-jammy-base:latest</builder> </image> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.0</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>aws</shadedClassifierName> </configuration> </plugin> </plugins> </build> </project>
关键变更与修复方案
Spring Cloud Function打包逻辑变更
Spring Cloud Function 4.x(对应2022.0.x版本)适配Spring Boot 3.1+和Java 17时,maven-shade-plugin必须添加Spring资源转换器,否则打包后的JAR会丢失Spring自动配置元数据,导致上下文无法加载。修复Maven Shade插件配置
修改shade插件配置,添加必要的转换器:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>aws</shadedClassifierName> <transformers> <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"/> <transformer implementation="org.springframework.boot.maven.ResourceTransformerSupport"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.springframework.boot.maven.ResourceTransformerSupport"> <resource>META-INF/spring.schemas</resource> </transformer> <transformer implementation="org.springframework.boot.maven.ResourceTransformerSupport"> <resource>META-INF/spring.tooling</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.demo.DemoApplication</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>Handler配置的可选优化
虽然原Handler路径仍可用,但Spring Cloud Function 4.x推荐直接使用org.springframework.cloud.function.adapter.aws.FunctionInvoker(省略方法名),不过核心问题还是打包配置缺失。Java 17运行时适配
确保AWS Lambda运行时选择Java 17环境,Spring Boot 3.1+默认已适配模块化,但需保证shade插件正确合并模块信息。
验证步骤
- 执行
mvn package,获取带aws分类器的JAR包 - 在AWS Lambda控制台上传该JAR,确认Handler配置正确
- 测试函数,若仍失败,查看CloudWatch日志定位具体错误
内容的提问来源于stack exchange,提问作者Kofi Boateng

