Wie behebe ich die Fehler „ClassNotFoundException“ und „NoSuchMethodError“ einer Java-Lambda-Funktion?

Lesedauer: 5 Minute
0

Wenn ich versuche, meine Java-AWS-Lambda-Funktion aufzurufen, erhalte ich die Fehler „ClassNotFoundException“ oder „NoSuchMethodError“. Wie behebe ich diese Fehler?

Kurzbeschreibung

Der Fehler ClassNotFoundException tritt auf, wenn eine Java-Laufzeitumgebung eine Klasse nach ihrem vollständig qualifizierten Namen lädt, die Klasse aber nicht findet.

**Hinweis:**Ein vollständig qualifizierter Klassenname in Java beinhaltet das Bereitstellungspaket und den Klassennamen einer Klasse.

Der Fehler NoSuchMethodError tritt auf, wenn sich eine referenzierte Abhängigkeitsversion von der Paketversion unterscheidet.

Weitere Informationen zur Paketstruktur für die Bereitstellung von Java-Lambda-Funktionen finden Sie unter Bereitstellen von Java-Lambda-Funktionen mit ZIP- oder JAR-Dateiarchiven.

Behebung

Hinweis: Wenn beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, stellen Sie sicher, dass Sie die neueste Version von AWS CLI verwenden.

Das Bereitstellungspaket der Lambda-Funktion herunterladen

Gehen Sie wie folgt vor, um die Dateistruktur des Bereitstellungspakets Ihrer Lambda-Funktion anzuzeigen:

So laden Sie das Bereitstellungspaket Ihrer Funktion herunter, indem Sie den Befehl zipinfo ausführen

Führen Sie den folgenden Befehl zipinfo aus:

Wichtig: Ersetzen Sie my-deployment-package.zip durch den Dateinamen Ihres Bereitstellungspakets. Der folgende Befehl ist nur für Linux-, Unix- und macOS-Betriebssysteme gültig.

$ zipinfo my-deployment-package.zip

So laden Sie das Bereitstellungspaket Ihrer Funktion herunter, indem Sie den AWS-CLI-Befehl Lambda get-function ausführen

Führen Sie den folgenden Befehl get-function aus:

Wichtig: Ersetzen Sie my-function durch den Namen Ihrer Funktion.

aws lambda get-function \
    --function-name  my-function

Die Befehlsausgabe enthält eine vorsignierte URL, die Sie zum Herunterladen der Datei verwenden können. Weitere Informationen finden Sie unter Abrufen einer Lambda-Funktion.

So laden Sie das Bereitstellungspaket Ihrer Funktion von der Lambda-Konsole herunter

1.Wählen Sie auf der Seite Funktionen der Lambda-Konsole Ihre Funktion aus.

2.Wählen Sie Aktionen aus.

  1. Wählen Sie Funktion exportieren aus.

  2. Wählen Sie im Dialogfeld Funktion exportieren die Option Bereitstellungspaket herunterladen aus.

Den Methodennamen des Funktionshandlers bestätigen

Weitere Informationen finden Sie unter AWS-Lambda-Funktionshandler in Java.

Suchen nach Problemen mit der CI/CD-Pipeline

Wenn Sie eine CI/CD-Pipeline (Continuous Integration and Continuous Delivery) verwenden, um Ihre Funktion zu packen und bereitzustellen, überprüfen Sie Folgendes:

  • Alle erforderlichen Abhängigkeiten wurden beim Paketieren der Funktion gebündelt.
  • Alle referenzierten Abhängigkeitsversionen sind korrekt.
  • Jede erforderliche Amazon Simple Storage Service (Amazon S3)-Bucket-URL ist vorhanden und verweist auf die neueste Version einer Datei.
    **Hinweis:**Die Amazon-S3-Bucket-URL ist erforderlich, wenn Sie eine Amazon-S3-Bucket-Quelle verwenden und die Bucket-Versionsverwaltung nur aktiviert ist.
  • Die Codeänderungen wurden bereitgestellt, bevor die Änderung der Handler-Konfiguration bereitgestellt wurde.
    Hinweis: Lambda hat keinen Mechanismus zum Aktualisieren von Code und Konfiguration in einer atomaren Änderung.

Suchen nach Problemen mit der Klassendatei

Überprüfen Sie Folgendes für die im Fehler ClassNotFoundException genannte Klasse:

  • Sie ist im Bereitstellungspaket enthalten.
    **Hinweis:**Wenn Sie die Klasse nicht finden können, wurde sie möglicherweise nicht gebündelt, als Sie das Bereitstellungspaket erstellt haben.
  • Der gebündelte Klassenname entspricht dem Handler-Wert Ihrer Funktion.
  • Es befindet sich im Verzeichnis /lib oder im Stammverzeichnis.
  • Wenn es als Lambda-Layer referenziert wird, wurde sein Inhalt nicht in ein anderes Verzeichnis als java/lib extrahiert.
  • Es ist dieselbe Version wie die Klasse, die mit Ihrer Funktion gepackt ist. Wenn die Klasse nicht dieselbe Version hat, überprüfen Sie, ob Ihr lokaler Computer eine andere Version hatte als die, die Sie gepackt haben.

Suchen nach Problemen mit der JAR-Datei

Bestätigen Sie, ob Ihre Funktion erwartungsgemäß auf einem lokalen Computer oder in einer AWS Serverless Application Model (AWS SAM)-Anwendung ausgeführt wird. Wenn Ihre Funktion nur fehlschlägt, wenn sie von Lambda aus aufgerufen wird, kann es an Problemen mit referenzierten Abhängigkeiten (JAR-Dateien) liegen.

**Tipp:**Erwägen Sie, die integrierte Entwicklungsumgebung (IDE) von Eclipse zu verwenden, um Ihre Java-Lambda-Funktionen zu erstellen. Wenn Sie ein Projekt mithilfe der in Eclipse verfügbaren Plugins erstellen, wird Ihr Projekt automatisch für einen ordnungsgemäßen Build konfiguriert. Weitere Informationen finden Sie unter Verwenden von Lambda mit dem AWS Toolkit für Eclipse.

Überprüfen Sie Folgendes für JAR-Dateien, die sich in einem lokalen Verzeichnis befinden und in einer Java CLASSPATH-Umgebungsvariablen angegeben sind:

  • Die Dateien sind im Bereitstellungspaket Ihrer Funktion enthalten.
    **Hinweis:**Wenn Sie keine JAR-Dateien finden, auf die verwiesen wird, wurden sie möglicherweise nicht gebündelt, als Sie das Bereitstellungspaket erstellt haben.
  • Die Dateiversionen sind mit den Dateien im Bereitstellungspaket identisch.

Wenn Dateien fehlen oder ihre Versionen falsch sind, kopieren Sie alle Abhängigkeiten (JAR-Dateien) in das Verzeichnis /lib oder das Stammverzeichnis. Stellen Sie sicher, dass Sie auf die richtigen Versionen verweisen. Laden Sie dann den komprimierten Inhalt hoch.

**Hinweis:**Wenn Sie ein Build-Tool wie Apache Maven oder Gradle verwenden, stellen Sie sicher, dass Sie beim Erstellen des Bereitstellungsartefakts die erforderlichen Plugins verwenden. Zum Beispiel das Apache Maven Shade Plugin.

Überprüfen, ob es Probleme mit den Berechtigungen gibt

Lambda erfordert, dass ZIP-Paketdateien globale Leseberechtigungen haben. Weitere Informationen finden Sie unter How do I troubleshoot Lambda „permission denied“ or „unable to import module“ errors when uploading a Lambda deployment package?

Wichtig: Nachdem Sie die Probleme identifiziert und behoben haben, müssen Sie Ihre Lambda-Funktion manuell bündeln und hochladen, um sie bereitzustellen. Prüfen Sie dann, ob der Fehler immer noch auftritt.


Ähnliche Informationen

AWS-Lambda-Funktionsfehler in Java

Instrumentierung von Java Code in AWS Lambda

Bibliotheksabhängigkeiten in eine Ebene einbeziehen

Bewährte Methoden für die Arbeit mit AWS-Lambda-Funktionen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren