Spring Cloud Function 3.2.6部署AWS Lambda遇FunctionInvoker类缺失问题
我正在使用Spring Cloud Function 3.2.6版本,将jar包压缩为ZIP文件上传至S3存储桶后,通过S3 URI部署到AWS Lambda。部署成功后出现如下错误:
{ "errorMessage": "Class not found: org.springframework.cloud.function.adapter.aws.FunctionInvoker", "errorType": "java.lang.ClassNotFoundException" } START RequestId: 7b189d8c-c597-4335-b598-76b9b3a1f639 Version: $LATEST Class not found: org.springframework.cloud.function.adapter.aws.FunctionInvoker: java.lang.ClassNotFoundException java.lang.ClassNotFoundException: org.springframework.cloud.function.adapter.aws.FunctionInvoker. Current classpath: file:/var/task/
以下是我的POM.xml配置:
<?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>2.7.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.acko</groupId> <artifactId>phoenix</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>phoenix</name> <description>phoenix</description> <properties> <java.version>14</java.version> <wrapper.version>1.0.27.RELEASE</wrapper.version> <aws-lambda-events.version>3.11.0</aws-lambda-events.version> <spring-cloud-function.version>3.2.6</spring-cloud-function.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> <version>3.2.6</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>${aws-lambda-events.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-dependencies</artifactId> <version>${spring-cloud-function.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> <dependencies> <dependency> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-layout</artifactId> <version>${wrapper.version}</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.1</version> </dependency> </dependencies> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>aws</shadedClassifierName> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"> <resource>META-INF/spring.factories</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </plugin> </plugins> </build> <modules> <module>alpha</module> </modules> </project>
我使用该版本Spring Cloud Function部署到AWS Lambda时,FunctionInvoker类缺失,请问我遗漏了什么配置?
这个问题的核心是构建产物未包含spring-cloud-function-adapter-aws依赖及必要类,导致Lambda运行时找不到FunctionInvoker。具体修复步骤如下:
1. 修正打包对象
父POM的打包方式是<packaging>pom</packaging>,业务代码实际在子模块alpha中。需要针对子模块执行打包命令,而非父模块,否则生成的文件不会包含子模块的代码和依赖。
2. 移除spring-boot-thin-layout
spring-boot-thin-layout生成的轻量jar包不会内置所有依赖,而是在运行时拉取——Lambda环境无法联网拉取缺失依赖,因此必须移除该配置:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- 删除spring-boot-thin-layout相关依赖配置 --> </plugin>
3. 确保shade插件正确生成胖jar
已经配置的maven-shade-plugin需要执行shade:shade目标来生成包含所有依赖的胖jar。针对子模块执行打包命令:
mvn clean package shade:shade -pl alpha
生成的胖jar包路径为target/alpha-0.0.1-SNAPSHOT-aws.jar,该包包含FunctionInvoker类及所有必要依赖。
4. 直接上传胖jar到S3
无需将jar包压缩为ZIP,直接上传生成的胖jar到S3,再通过S3 URI部署到Lambda即可——Lambda支持直接部署jar包。
5. 验证Lambda处理程序配置
确保Lambda的处理程序设置为org.springframework.cloud.function.adapter.aws.FunctionInvoker,这是Spring Cloud Function适配Lambda的入口类。
内容的提问来源于stack exchange,提问作者Chandan Mishra

