You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:55:21