Class not found: com.app.handler.AsynchronousLambdaHandler: java.lang.ClassNotFoundException, Current classpath: file:/var/task/

huangapple go评论116阅读模式
英文:

Class not found: com.app.handler.AsynchronousLambdaHandler: java.lang.ClassNotFoundException, Current classpath: file:/var/task/

问题

我已经开发了一个Spring Boot REST API,并尝试使用Serverless框架将其部署为API Gateway上的Lambda,但遇到了以下错误:

  1. 找不到类:com.app.handler.AsynchronousLambdaHandlerjava.lang.ClassNotFoundException
  2. java.lang.ClassNotFoundExceptioncom.app.handler.AsynchronousLambdaHandler。当前类路径:file:/var/task/

我正在使用Spring Boot版本2.7.10,Java版本11,Maven作为构建工具,以及Serverless作为部署工具将应用程序部署到AWS中。

处理程序类位于BOOT-INF/classes/com/app/handler/AsynchronousLambdaHandler.class,在将应用程序打包为.jar文件后可用。

serverless.yml 文件如下:

  1. service: integration-service
  2. provider:
  3. name: aws
  4. region: us-east-1
  5. stage: ${opt:stage, 'dev'}
  6. functions:
  7. "integration-service":
  8. handler: com.app.handler.AsynchronousLambdaHandler::handleRequest
  9. name: ${opt:stage, 'dev'}-integration-service
  10. runtime: java11
  11. memorySize: 512
  12. events:
  13. - http: ANY /{proxy+}

pom.xml 文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.10</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.app</groupId>
  12. <artifactId>integration-service</artifactId>
  13. <version>1.0.0</version>
  14. <name>integration-service</name>
  15. <description>Integration Service</description>
  16. <properties>
  17. <java.version>11</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-data-jpa</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>com.amazonaws.serverless</groupId>
  30. <artifactId>aws-serverless-java-container-springboot2</artifactId>
  31. <version>1.9.2</version>
  32. </dependency>
  33. </dependencies>
  34. <build>
  35. <plugins>
  36. <plugin>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-maven-plugin</artifactId>
  39. <configuration>
  40. <finalName>${project.artifactId}</finalName>
  41. </configuration>
  42. </plugin>
  43. </plugins>
  44. </build>
  45. </project>

AsynchronousLambdaHandler.java 文件如下:

  1. package com.app.handler;
  2. import com.amazonaws.serverless.exceptions.ContainerInitializationException;
  3. import com.amazonaws.serverless.proxy.model.*;
  4. import com.amazonaws.serverless.proxy.spring.*;
  5. import com.amazonaws.services.lambda.runtime.*;
  6. import com.app.IntegrationServiceApplication;
  7. public class AsynchronousLambdaHandler implements RequestHandler<AwsProxyRequest, AwsProxyResponse> {
  8. private SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
  9. public AsynchronousLambdaHandler() throws ContainerInitializationException {
  10. handler = (SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse>) new SpringBootProxyHandlerBuilder()
  11. .springBootApplication(IntegrationServiceApplication.class)
  12. .asyncInit()
  13. .buildAndInitialize();
  14. }
  15. @Override
  16. public AwsProxyResponse handleRequest(AwsProxyRequest input, Context context) {
  17. return handler.proxy(input, context);
  18. }
  19. }

我也尝试了许多选项,包括这个(https://stackoverflow.com/questions/72535951/aws-lambda-function-throws-classnotfoundexception-lambdahandler-current-class),但迄今为止都没有运气。

编辑:

已更新pom.xml 以删除Maven插件,以简化问题。

pom.xml(已更新) 如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.10</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.app</groupId>
  12. <artifactId>integration-service</artifactId>
  13. <version>1.0.0</version>
  14. <name>integration-service</name>
  15. <description>Integration Service</description>
  16. <properties>
  17. <java.version>11</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-data-jpa</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>com.amazonaws.serverless</groupId>
  30. <artifactId>aws-serverless-java-container-springboot2</artifactId>
  31. <version>1.9.2</version>
  32. </dependency>
  33. </dependencies>
  34. <build>
  35. <finalName>${artifactId}</finalName>
  36. </build>
  37. </project>
英文:

I have developed a spring boot REST API, trying to deploy it using serverless framework as a Lambda on top of API Gateway, and encountered the following the error

  1. Class not found: com.app.handler.AsynchronousLambdaHandler: java.lang.ClassNotFoundException
  2. java.lang.ClassNotFoundException: com.app.handler.AsynchronousLambdaHandler. Current classpath: file:/var/task/

I am using Spring Boot version 2.7.10, java version 11, maven as a build tool, and serverless as a deployment tool to deploy the application in AWS.

The handler class is available at BOOT-INF/classes/com/app/handler/AsynchronousLambdaHandler.class post-packing the application as a .jar file.

serverless.yml

  1. service: integration-service
  2. provider:
  3. name: aws
  4. region: us-east-1
  5. stage: ${opt:stage, &#39;dev&#39;}
  6. functions:
  7. &quot;integration-service&quot;:
  8. handler: com.app.handler.AsynchronousLambdaHandler::handleRequest
  9. name: ${opt:stage, &#39;dev&#39;}-integration-service
  10. runtime: java11
  11. memorySize: 512
  12. events:
  13. - http: ANY /{proxy+}

pom.xml

  1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  2. &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  3. xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  4. &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  5. &lt;parent&gt;
  6. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  7. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  8. &lt;version&gt;2.7.10&lt;/version&gt;
  9. &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;
  10. &lt;/parent&gt;
  11. &lt;groupId&gt;com.app&lt;/groupId&gt;
  12. &lt;artifactId&gt;integration-service&lt;/artifactId&gt;
  13. &lt;version&gt;1.0.0&lt;/version&gt;
  14. &lt;name&gt;integration-service&lt;/name&gt;
  15. &lt;description&gt;Integration Service&lt;/description&gt;
  16. &lt;properties&gt;
  17. &lt;java.version&gt;11&lt;/java.version&gt;
  18. &lt;/properties&gt;
  19. &lt;dependencies&gt;
  20. &lt;dependency&gt;
  21. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  22. &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
  23. &lt;/dependency&gt;
  24. &lt;dependency&gt;
  25. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  26. &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;
  27. &lt;/dependency&gt;
  28. &lt;dependency&gt;
  29. &lt;groupId&gt;com.amazonaws.serverless&lt;/groupId&gt;
  30. &lt;artifactId&gt;aws-serverless-java-container-springboot2&lt;/artifactId&gt;
  31. &lt;version&gt;1.9.2&lt;/version&gt;
  32. &lt;/dependency&gt;
  33. &lt;/dependencies&gt;
  34. &lt;build&gt;
  35. &lt;plugins&gt;
  36. &lt;plugin&gt;
  37. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  38. &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
  39. &lt;configuration&gt;
  40. &lt;finalName&gt;${project.artifactId}&lt;/finalName&gt;
  41. &lt;/configuration&gt;
  42. &lt;/plugin&gt;
  43. &lt;plugin&gt;
  44. &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
  45. &lt;artifactId&gt;maven-shade-plugin&lt;/artifactId&gt;
  46. &lt;version&gt;3.2.4&lt;/version&gt;
  47. &lt;configuration&gt;
  48. &lt;createDependencyReducedPom&gt;false&lt;/createDependencyReducedPom&gt;
  49. &lt;/configuration&gt;
  50. &lt;executions&gt;
  51. &lt;execution&gt;
  52. &lt;phase&gt;package&lt;/phase&gt;
  53. &lt;goals&gt;
  54. &lt;goal&gt;shade&lt;/goal&gt;
  55. &lt;/goals&gt;
  56. &lt;/execution&gt;
  57. &lt;/executions&gt;
  58. &lt;/plugin&gt;
  59. &lt;/plugins&gt;
  60. &lt;/build&gt;
  61. &lt;/project&gt;

AsynchronousLambdaHandler.java

  1. package com.app.handler;
  2. import com.amazonaws.serverless.exceptions.ContainerInitializationException;
  3. import com.amazonaws.serverless.proxy.model.*;
  4. import com.amazonaws.serverless.proxy.spring.*;
  5. import com.amazonaws.services.lambda.runtime.*;
  6. import com.app.IntegrationServiceApplication;
  7. public class AsynchronousLambdaHandler implements RequestHandler&lt;AwsProxyRequest, AwsProxyResponse&gt; {
  8. private SpringBootLambdaContainerHandler&lt;AwsProxyRequest, AwsProxyResponse&gt; handler;
  9. public AsynchronousLambdaHandler() throws ContainerInitializationException {
  10. handler = (SpringBootLambdaContainerHandler&lt;AwsProxyRequest, AwsProxyResponse&gt;) new SpringBootProxyHandlerBuilder()
  11. .springBootApplication(IntegrationServiceApplication.class)
  12. .asyncInit()
  13. .buildAndInitialize();
  14. }
  15. @Override
  16. public AwsProxyResponse handleRequest(AwsProxyRequest input, Context context) {
  17. return handler.proxy(input, context);
  18. }
  19. }

I have also explored a lot of options including this one (<https://stackoverflow.com/questions/72535951/aws-lambda-function-throws-classnotfoundexception-lambdahandler-current-class>) but no luck so far.

Edit:

Updated the pom.xml to remove maven plugins to simplyfy the problem.

pom.xml (updated)

  1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  2. &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  3. xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  4. &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  5. &lt;parent&gt;
  6. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  7. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  8. &lt;version&gt;2.7.10&lt;/version&gt;
  9. &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;
  10. &lt;/parent&gt;
  11. &lt;groupId&gt;com.app&lt;/groupId&gt;
  12. &lt;artifactId&gt;integration-service&lt;/artifactId&gt;
  13. &lt;version&gt;1.0.0&lt;/version&gt;
  14. &lt;name&gt;integration-service&lt;/name&gt;
  15. &lt;description&gt;Integration Service&lt;/description&gt;
  16. &lt;properties&gt;
  17. &lt;java.version&gt;11&lt;/java.version&gt;
  18. &lt;/properties&gt;
  19. &lt;dependencies&gt;
  20. &lt;dependency&gt;
  21. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  22. &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
  23. &lt;/dependency&gt;
  24. &lt;dependency&gt;
  25. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  26. &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;
  27. &lt;/dependency&gt;
  28. &lt;dependency&gt;
  29. &lt;groupId&gt;com.amazonaws.serverless&lt;/groupId&gt;
  30. &lt;artifactId&gt;aws-serverless-java-container-springboot2&lt;/artifactId&gt;
  31. &lt;version&gt;1.9.2&lt;/version&gt;
  32. &lt;/dependency&gt;
  33. &lt;/dependencies&gt;
  34. &lt;build&gt;
  35. &lt;finalName&gt;${artifactId}&lt;/finalName&gt;
  36. &lt;/build&gt;
  37. &lt;/project&gt;

答案1

得分: 0

  1. 经过查看了许多博客、文档和不同的网页之后,我终于找到了解决方案。正如所有人建议的那样,在pom.xml中添加了以下代码,但大家忽略的最重要的一点是,***不要部署普通的`.jar`文件,而要部署您的`-aws.jar`文件***。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>aws</shadedClassifierName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>org.apache.tomcat.embed:*</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>

  1. <details>
  2. <summary>英文:</summary>
  3. I finally found the solution after going through a lot of blogs, docs, and different web pages. As everyone is suggesting, I have added the following code in pom.xml but the most important point that folks missed highlighting is ***instead of deploying the normal `.jar` file deploy your `-aws.jar` file***.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>aws</shadedClassifierName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>org.apache.tomcat.embed:*</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>

  1. </details>

huangapple
  • 本文由 发表于 2023年4月4日 15:40:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/75926696.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定