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

Spring Cloud整合AWS Lambda遇MAIN_CLASS未找到问题求助

Spring Boot 3.1.6 + Java17 下Spring Cloud Function AWS Lambda调用失败排查

背景

此前使用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>

关键变更与修复方案

  1. Spring Cloud Function打包逻辑变更
    Spring Cloud Function 4.x(对应2022.0.x版本)适配Spring Boot 3.1+和Java 17时,maven-shade-plugin必须添加Spring资源转换器,否则打包后的JAR会丢失Spring自动配置元数据,导致上下文无法加载。

  2. 修复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>
    
  3. Handler配置的可选优化
    虽然原Handler路径仍可用,但Spring Cloud Function 4.x推荐直接使用org.springframework.cloud.function.adapter.aws.FunctionInvoker(省略方法名),不过核心问题还是打包配置缺失。

  4. Java 17运行时适配
    确保AWS Lambda运行时选择Java 17环境,Spring Boot 3.1+默认已适配模块化,但需保证shade插件正确合并模块信息。

验证步骤

  • 执行mvn package,获取带aws分类器的JAR包
  • 在AWS Lambda控制台上传该JAR,确认Handler配置正确
  • 测试函数,若仍失败,查看CloudWatch日志定位具体错误

内容的提问来源于stack exchange,提问作者Kofi Boateng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:15:17