我有一个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);
}
}
请在文件中添加这两个依赖项
1)AWS-lambda-java-core
2) aws lambda java事件
这应该可以解决它
尝试使用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.
你找到解决办法了吗?我一直得到同样的准确错误。
到目前为止,我能说的是,与其他语言(如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,和类是在。 确保它们都是相同的版本。
问题内容: 我知道如何创建对具有参数的方法的引用,并返回,它是: 但是,如果该函数引发异常,例如定义为: 如何定义此参考? 问题答案: 你需要执行以下操作之一。 如果是你的代码,请定义自己的函数接口,该接口声明已检查的异常: 并使用它: 否则,包装一个不声明检查异常的方法: 接着: 要么: