#amazon-web-services #aws-lambda #amazon-dynamodb #noclassdeffounderror
#amazon-web-services #aws-lambda #amazon-dynamodb #ошибка noclassdeffounderror
Вопрос:
Я получаю следующую ошибку при запуске моей лямбда-функции, которая должна помещать элемент an в мою таблицу DynamoDB.
"errorMessage": "com/amazonaws/services/dynamodbv2/AmazonDynamoDBClientBuilder",
"errorType": "java.lang.NoClassDefFoundError",
"stackTrace": [
"dao.EventDAO.insertEvent(EventDAO.java:15)",
"service.PostEventService.postEvent(PostEventService.java:12)",
"handler.PostEventHandler.handle(PostEventHandler.java:11)",
"java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
"java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)",
"java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)",
"java.base/java.lang.reflect.Method.invoke(Unknown Source)"
]
И вот мой код, который пытается вставить в таблицу:
package dao;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.PutItemOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
import request.PostEventRequest;
import response.PostEventResponse;
public class EventDAO {
public PostEventResponse insertEvent(PostEventRequest request) {
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
DynamoDB dynamoDB = new DynamoDB(client);
Table table = dynamoDB.getTable("Event");
PostEventResponse response = new PostEventResponse();
// Build the item
Item item = new Item()
.withPrimaryKey("eventId", request.eventId)
.withString("username", request.username)
.withString("image", request.image)
.withString("description", request.description)
.withString("time", request.time);
// Write the item to the table
PutItemOutcome outcome = table.putItem(item);
return response;
}
}
и вот мой pom.xml как я подозреваю, это может быть важно:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.327</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<groupId>earnshawsfinest</groupId>
<artifactId>rally-backend</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
По какой-то причине, когда он находится в lambda, он не распознает класс AmazonDynamoDbClientBuilder, хотя в моем проекте в IntelliJ он есть и важен. Мой проект IntelliJ строится без проблем и экспортирует jar (с модулями и зависимостями), которые я загружаю в lambda. Лямбда будет работать нормально, если я удалю содержимое DynamoDB.
Я чувствую, что, возможно, мне где-то не хватает какой-то загрузки или импорта, но я не знаю, что. Я следил за всевозможными учебными пособиями от Amazon, и я даже делал это раньше, но я не сталкивался с этой проблемой. Любая помощь? Заранее спасибо!!
Ответ №1:
По умолчанию зависимости не объединены внутри файла jar. Вам нужно это сделать или предоставить их в отдельном лямбда-слое
Проверьте ссылку Создание пакета развертывания с помощью Maven и посмотрите, как использовать maven-shade-plugin
, который должен создавать все зависимости внутри целевого файла jar.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>