【问题标题】:Why invocation of class file in lambda layer throwing error?为什么在 lambda 层调用类文件抛出错误?
【发布时间】:2021-11-05 00:03:45
【问题描述】:

我正在尝试使用 java 实现 lambda 层。我为 lambda 层创建了一个项目,下面是代码:

图层代码

  1. pom.xml

     <project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven- 
     4.0.0.xsd">
         <modelVersion>4.0.0</modelVersion>
         <groupId>com.i3l.layer</groupId>
         <artifactId>customlayer</artifactId>
         <version>1.1.0</version>
     </project>
    
  2. DataHandler.java

    package customlayer;
    
    public class DataHandler {
    
     public String getData(String input) {
        System.out.println("Inside Layer");
        return "Hello from Layer "+input;
     }
    }
    

功能代码: 我在 pom.xml 中添加了层依赖,例如:

<dependency>
    <groupId>com.i3l.layer</groupId>
    <artifactId>customlayer</artifactId>
    <version>1.1.0</version>
    <scope>provided</scope>
</dependency>

LambdaFunctionHandler.java

package com.amazonaws.lambda.userlayertest;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import customlayer.DataHandler;

public class LambdaFunctionHandler implements RequestHandler<RequestObject, String> {

@Override
public String handleRequest(RequestObject input, Context context) {
    
    System.out.println("call to layer");
    DataHandler dataHandler = new DataHandler();
    String data = dataHandler.getData(input.getBody());
    return data;
 }
}

我尝试将 jar 直接上传到 layer 并将 jar 放入 zip 中,然后将其上传到 layer。在这两种情况下,我都会遇到错误:

"errorMessage": "customlayer/DataHandler",
"errorType": "java.lang.NoClassDefFoundError",

注意:我已经在 lambda 函数中添加了带有版本号的层。

如果有人帮我弄清楚为什么在 layer.xml 中找不到 java 类,那就太好了。我已经从 layer 下载了代码,我可以看到类文件在正确的路径中。

【问题讨论】:

    标签: java aws-lambda aws-lambda-layers


    【解决方案1】:

    这里的问题在于目录结构。层依赖项应该在一个特定的目录中,并且它随运行时环境而变化。所以在这种情况下,customlayer-1.1.0.jar 应该在java/lib 中,然后它将被存档。假设档案名称是customlayer.zip,那么结构将是

    customlayer.zip
    └ java/lib/customlayer-1.1.0.jar
    

    这个结构会随着运行时环境而变化。

    更多详情:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

    【讨论】:

      【解决方案2】:

      此外,要自动创建它,可以创建一个如下所示的 assembly.xml。

      <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
          <id>bin</id>
          <baseDirectory>/</baseDirectory>
          <formats>
              <format>zip</format>
          </formats>
          <fileSets>
              <fileSet>
                  <directory>${project.build.directory}</directory>
                  <outputDirectory>/java/lib</outputDirectory>
                  <includes>
                      <include>${project.artifactId}.jar</include>
                  </includes>
              </fileSet>
          </fileSets>
      </assembly>
      

      然后在你的 pom.xml 中,添加插件并配置这个 assembly.xml 文件。

              <plugin>
                  <artifactId>maven-assembly-plugin</artifactId>
                  <version>2.6</version>
                  <configuration>
                      <descriptors>
                          <descriptor>assembly.xml</descriptor>
                      </descriptors>
                      <appendAssemblyId>false</appendAssemblyId>
                  </configuration>
                  <executions>
                      <execution>
                          <id>make-assembly</id> <!-- this is used for inheritance merges -->
                          <phase>package</phase> <!-- append to the packaging phase. -->
                          <goals>
                              <goal>single</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多