当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda函数抛出ClassNotFoundExcture

庞鸿骞
2023-03-14

我有一个Spring Boot演示项目。我试图在AWS Lambda中部署它们,但我得到ClassNotFoundExcema甚至认为我上传的罐子包含必要的依赖项。

这是我的代码:

波姆。xml

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.1</version>
    </dependency>

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-events</artifactId>
        <version>3.6.0</version>
    </dependency>

    <dependency>
        <groupId>com.amazonaws.serverless</groupId>
        <artifactId>aws-serverless-java-container-spring</artifactId>
        <version>[0.1,)</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

应用类

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        System.out.println("Welcome to demo project");
    }
}

控制器类

@RestController
public class DemoController {

    @GetMapping(value="/getValue")
    public String getId() {
        return " Call from controller";
    }
}

兰姆达汉德勒类

public class DemoLambdaHandler implements RequestStreamHandler {

    public static SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;

    static {
        try {
            handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(DemoApplication.class);
        } catch (ContainerInitializationException e) {
            e.printStackTrace();
            throw new RuntimeException("Container not initialized", e);
        }
    }

    @Override
    public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
        // TODO Auto-generated method stub
        handler.proxyStream(input, output, context);

    }
}

共有3个答案

安聪
2023-03-14

请在文件中添加这两个依赖项

1)AWS-lambda-java-core

2) aws lambda java事件

这应该可以解决它

蒲昊苍
2023-03-14

尝试使用Maven构建项目,并确保在POM中具有所需的Maven shade插件,以便在运行mvn包时使用依赖项构建JAR。如果缺少此插件,您将创建一个不包含依赖项的JAR,并且将遇到ClassNotFoundException。

要了解如何使用Lambda运行时Java API构建和部署Lambda函数,请参阅本AWS教程。它将引导您逐步完成构建Lambda函数的过程:

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases/creating_workflows_stepfunctions

然后,本教程使用步骤函数中的Lambda函数创建工作流。

Lambda函数是使用Lambda运行时Java API--com创建的。亚马逊。服务。拉姆达。运行时。请求处理程序。请不要使用Spring BootAPI来创建Lambda函数。

但是,如果您想从Spring Boot应用程序调用Lambda函数,然后例如在视图中显示结果,那么您可以使用Lambda客户端JavaAPI-software.amazon.awssdk.services.lambda.LambdaClient。

所以总结一下:

>

  • com。亚马逊。服务。拉姆达。运行时。RequestHandler用于使用Java Lambda运行时API创建Lambda函数。

    software.amazon.awssdk.services.lambda.LambdaClient是Lambda客户端JavaAPI V2,允许您与部署的Lambda函数交互。例如,您可以使用此客户端从Java应用程序(如Spring BootWeb应用程序)调用Lambda函数。若要查看如何使用Lambda客户端API调用Lambda函数的工作html" target="_blank">示例,请参阅https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javav2/example_code/lambda/src/main/java/com/example/lambda/LambdaInvoke.java.

  • 汪安宁
    2023-03-14

    你找到解决办法了吗?我一直得到同样的准确错误。

    到目前为止,我能说的是,与其他语言(如nodejs)不同,docker image for java具有指定的命令,如CMD[“com.example.LambdaHandler::handleRequest”],而nodejs是CMD[“app.handler”]。这里的区别在于nodejs one指定文件是什么,例如app。函数名为handler的js

    但是JavaOne只有类路径,无法指定FATJAR文件的路径,即使JAR文件位于“var/task”中。lambda如何知道JAR文件名?

     类似资料:
    • 我知道如何创建对具有参数并返回的方法的引用,它是: 但是,如果函数抛出异常(假设它被定义为: 我如何定义这个引用?

    • 当异常在构造函数中被抛出时,其中创建了多个对象,必须做些什么来清理内存。例如。 我的直觉是,将每个对new的调用放在一个单独的try-catch组中,并删除之前为其调用了,但这太冗长的所有对象(第一个try组不调用析构函数,第二个类调用第一个类的析构函数,第三个类调用前两个类的析构函数,以此类推)。我的问题是:最常见的处理方法是什么? 另外,假设类对象包含一个不是用new创建的对象(因为它在堆栈上

    • 这是主要的方法: 运行时,这是堆栈跟踪:

    • 问题内容: 我正在使用Jackson示例代码对POJO进行反序列化: 这行抛出一个NoSuchMethodError: 我不明白 问题答案: 我猜您的Jackson JAR不同步。本类是JAR,和类是在。 确保它们都是相同的版本。

    • 问题内容: 我知道如何创建对具有参数的方法的引用,并返回,它是: 但是,如果该函数引发异常,例如定义为: 如何定义此参考? 问题答案: 你需要执行以下操作之一。 如果是你的代码,请定义自己的函数接口,该接口声明已检查的异常: 并使用它: 否则,包装一个不声明检查异常的方法: 接着: 要么: