首页 > 解决方案 > 带有批处理的 Spring Boot 应用程序在 Amazon AWS Lambda 环境中不起作用

问题描述

我的 spring 批处理启动应用程序是读取文件并插入到数据库中。我是 AWS Lambda 功能的新手,它们几乎没有可用资源。

当我在 AWS 上测试 jar 时,得到了ClassNotFoundException.

@SpringBootApplication
@EnableAutoConfiguration
@EnableJpaRepositories("my.repository")
@ComponentScan("my.package")
@EnableScheduling
public class Main implements RequestHandler<KinesisEvent, String>{

@Autowired
JobLauncher launcher;

@Autowired
Job job;

public static void startApp(){
    System.exit(SpringApplication
            .exit(SpringApplication.run(Main.class)));
}

public class Handler implements RequestHandler<KinesisEvent, String> {

@Override
public String handleRequest(KinesisEvent input, Context context) {
    context.getLogger().log("Input: " + input);

    Main.startApp();
    // TODO: implement your handler
    return "Hello from Lambda";
}

My _build.gradle_:

dependencies {

compile 'org.springframework.batch:spring-batch-core:4.0.0.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-batch:2.0.4.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-data- 
jpa:2.0.4.RELEASE'
compile 'com.microsoft.sqlserver:mssql-jdbc:6.1.0.jre8'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.amazonaws:aws-lambda-java-core:1.2.0'
compile 'com.amazonaws:aws-lambda-java-events:2.1.0'

}
jar {
manifest{
    baseName = "${projectName}"
    version = ("${project.archiveVersion}")
 }
} 

task buildZip(type: Zip) {
from compileJava
from processResources              
into('lib') {
    from configurations.compileClasspath
 }           
}
build.dependsOn buildZip

Handler info on AWS Lambda- 
my.package.Handler::handleRequest

Class not found: my.package.Handler: 
java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: my.package.Handler
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)

标签: javaamazon-web-servicesspring-bootaws-lambdaspring-batch

解决方案


那是因为 gradle 依赖项不在您在 lambda 函数中部署的 jar 中。jar 需要注入所有依赖项 jar。


推荐阅读