【问题标题】:AWS Lambda: class java.lang.ClassNotFoundExceptionAWS Lambda:类 java.lang.ClassNotFoundException
【发布时间】:2017-07-30 07:31:16
【问题描述】:

我收到此消息,但我不知道如何解决它。在网上搜索并尝试实施他们的建议,但还没有运气。

我基本上按照此链接中指定的说明进行操作 - http://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda-tutorial.html

但我没有使用嵌入在 Eclipse 中的 AWS 管理控制台上传项目,而是尝试创建项目的 zip 并将其上传到 AWS Web 控制台。

以下是我的项目结构 -

就是这样!!我在这里没有什么特别想做的。这只是 Lambda 中的一个 HelloWorld 示例。

现在,这就是我创建 zip 文件的方式,这在 Eclipse 中非常简单 -

创建 zip 后,我将其上传到代码选项卡下的 AWS Web 控制台 -

配置选项卡看起来像这样 -

现在,当我单击“测试”按钮时,找不到 example.Hello 类。

为什么 Lambda 函数很难找到这个类?谁能建议这次执行中可能出了什么问题?

还附上日志语句,以防有帮助-

【问题讨论】:

  • 我通过进行以下更改解决了这个问题 - 首先,我将方法签名更改为 :: public String handleRequest(Map input, Context context) :: 第二,在进行这两项更改后,AWS Lambda 能够找到该类,而不是将其导出为 zip,而是将其导出为普通 jar。希望这对您有所帮助并节省您的时间。
  • 只是想插话,我尝试了同样的事情,只是将 uber jar 文件上传到 s3 而不是它的压缩包,它对我有用。

标签: amazon-web-services deployment aws-lambda classnotfoundexception


【解决方案1】:

以下内容对我有用。

  1. 在 AWS 控制台中转到您的 lambda 函数
  2. 单击代码选项卡。
  3. 编辑运行时设置
  4. 将 example.Hello::handleRequest 替换为流处理程序的完整类路径。例如 com.abc.company.app.StreamLambdaHandler::handleRequest
  5. 保存。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,对我有用的是,如果您使用 maven 从 eclipse 运行它,请确保您的 pom.xml 中有以下插件:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <excludes>
                  <exclude>com.amazonaws:aws-lambda-java-events</exclude>
                  <exclude>com.amazonaws:aws-lambda-java-core</exclude>
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
    

    然后使用:mvn package shade:shade 运行项目以在您的目标目录中生成 jar 工件。之后,eclipse 应该将正确的 jar 上传到 lambda。

    【讨论】:

    • 我遇到了类似的问题,想知道......什么是“阴影”,为什么您认为这可以解决问题?抱歉,我对 Java 有点不了解。
    • Shade 插件构建所有依赖项的 JAR
    【解决方案3】:

    请注意,您的 RequestHandler 接口的泛型类型与默认类型不同:

    默认:public class Hello implements RequestHandler&lt;Object, String&gt;

    你的:public class Hello implements RequestHandler&lt;String, String&gt;

    给出ClassNotFoundException的原因

    【讨论】:

      【解决方案4】:

      您可以使用 spring-boot-maven-plugin 插件代替 maven-shade-plugin,并使用 spring-boot-thin-layout 依赖项和其他配置,如下所示。

      <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot.experimental</groupId>
                  <artifactId>spring-boot-thin-layout</artifactId>
                  <version>1.0.26.RELEASE</version>
              </dependency>
          </dependencies>
          <configuration>
              <createDependencyReducedPom>false</createDependencyReducedPom>
              <shadedArtifactAttached>true</shadedArtifactAttached>
              <shadedClassifierName>aws</shadedClassifierName>
              <transformers>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                      <resource>META-INF/spring.handlers</resource>
                  </transformer>
                  <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer">
                      <resource>META-INF/spring.factories</resource>
                  </transformer>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                      <resource>META-INF/spring.schemas</resource>
                  </transformer>
              </transformers>
          </configuration>
      </plugin>
      

      PS:

      1. 移除 maven-shade-plugin
      2. 我已经推荐了 spring.cloud.io 的 Official documentation

      【讨论】:

        【解决方案5】:

        非 Maven 答案

        它不工作的原因是因为 Lambda 期望在 zip 中编译 *.class 文件。不幸的是,它不会为您编译 Java 文件。

        在尝试上传独立 Java 文件(不使用 Maven 或 Gradle 或其他任何东西)时,我收到了与您相同的错误消息。虽然没有很好的记录,但我注意到AWS documentation 上的这个微妙细节暗示了类文件(grep 部分):

        示例 test-zip.sh

        mkdir -p expanded
        unzip path/to/my/function.zip -d expanded
        find ./expanded/lib -name '*.jar' | xargs -n1 zipinfo -1 | grep '.*.class' | >sort | uniq -c | sort
        

        当我上传一个仅包含类文件的 zip 文件时,Lambda 最终正确找到了该文件。虽然,为了编译,我不得不删除 AWS Context 参数,所以 Lambda 产生了一条不同的错误消息,指出处理程序方法签名不匹配(但它找到了文件)。

        【讨论】:

          猜你喜欢
          • 2018-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-14
          • 2021-01-18
          • 1970-01-01
          • 2021-04-13
          • 2019-10-31
          相关资源
          最近更新 更多