AWS Lambda:类java.lang.ClassNotFoundException

时间:2017-03-09 10:44:41

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

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

我基本上遵循了此链接中指定的说明 - http://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda-tutorial.html

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

以下是我项目的结构 - enter image description here

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

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

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

“配置”选项卡看起来像这样 - enter image description here

现在当我点击Test按钮时,它无法找到example.Hello类。

为什么Lambda函数找到这个类变得如此困难?任何人都可以建议在执行中可能出现什么问题吗?

还附上了日志声明,以防它有用 -

enter image description here

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,对我来说有用的是如果你用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。

答案 1 :(得分:1)

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

默认:cursor.execute()

你的:public class Hello implements RequestHandler<Object, String>

它给出ClassNotFoundException的原因

答案 2 :(得分:1)

以下对我有用。

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

答案 3 :(得分:0)

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

<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>

附注:

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