Come posso risolvere gli errori "ClassNotFoundException" e "NoSuchMethodError" ricevuti da una funzione Lambda in Java?

5 minuti di lettura
0

Quando provo a richiamare la mia funzione AWS Lambda in Java, ricevo gli errori "ClassNotFoundException" o "NoSuchMethodError". Come posso risolvere questi errori?

Breve descrizione

L'errore ClassNotFoundException si verifica quando un runtime Java carica una classe con il suo nome completamente qualificato, ma non individua la classe.

Nota: un nome di classe completamente qualificato in Java include il pacchetto di implementazione e il nome della classe.

L'errore NoSuchMethodError si verifica quando una versione della dipendenza referenziata è diversa dalla versione in pacchetto.

Per ulteriori informazioni sulla struttura del pacchetto di implementazione della funzione Lambda per Java, consulta la pagina Distribuisci funzioni Lambda per Java con archivi di file .zip o JAR.

Risoluzione

Nota: se ricevi errori durante l'esecuzione dei comandi dell'Interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.

Scarica il pacchetto di implementazione della funzione Lambda

Per visualizzare la struttura del file del pacchetto di implementazione della funzione Lambda, esegui una delle operazioni seguenti:

Scarica il pacchetto di implementazione della funzione eseguendo il comando zipinfo

Esegui il seguente comando zipinfo:

Importante: sostituisci my-deployment-package.zip con il nome del file del pacchetto di implementazione. Il comando seguente è valido solo per i sistemi operativi Linux, Unix e macOS.

$ zipinfo my-deployment-package.zip

Scarica il pacchetto di implementazione della funzione eseguendo il comando Lambda get-function in AWS CLI

Esegui il seguente comando get-function:

Importante: sostituisci my-function con il nome della funzione Lambda.

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

L'output del comando fornisce un URL prefirmato che è possibile utilizzare per scaricare il file. Per ulteriori informazioni, consulta la pagina Recupera una funzione Lambda.

Scarica il pacchetto di implementazione della funzione dalla console Lambda

1.    Nella pagina Funzioni della console Lambda, scegli la tua funzione.

2.    Scegli Operazioni.

3.    Scegli Esporta funzione.

4.    Nella finestra di dialogo Esporta la tua funzione, scegli Scarica pacchetto di distribuzione.

Conferma il nome del metodo del gestore della funzione

Per ulteriori informazioni, consulta la pagina Gestore della funzione AWS Lambda in Java.

Verifica eventuali problemi relativi alla pipeline CI/CD

Se stai utilizzando una pipeline di integrazione e distribuzione continua (CI/CD) per impacchettare e implementare la tua funzione, verifica quanto segue:

  • Tutte le dipendenze richieste siano state raggruppate in bundle durante la creazione del pacchetto della funzione.
  • Tutte le versioni delle dipendenze referenziate siano corrette.
  • Eventuali URL del bucket Amazon Simple Storage Service (Amazon S3) richiesti esistano e rimandino alla versione più recente di un file.
    Nota: l'URL del bucket Amazon S3 è richiesto se si utilizza un'origine del bucket Amazon S3 ed è solo attivato il controllo delle versioni del bucket.
  • Le modifiche al codice siano state implementate prima che la modifica apportata alla configurazione del gestore fosse implementata.
    Nota: Lambda non dispone di un meccanismo per aggiornare il codice e la configurazione in un'unica modifica atomica.

Verifica eventuali problemi relativi ai file della classe

Verifica quanto segue per la classe indicata nell'errore ClassNotFoundException:

  • Sia inclusa nel pacchetto di implementazione.
    Nota: se non riesci a trovare la classe, potrebbe non essere stata inclusa in bundle al momento della creazione del pacchetto di implementazione.
  • Il nome della classe in bundle sia uguale al valore del gestore della funzione.
  • Si trovi nella directory /lib o nella directory root.
  • Se è referenziata come livello Lambda, il suo contenuto non sia stato estratto in una directory diversa da java/lib.
  • Sia della stessa versione della classe impacchettata con la tua funzione. Se la classe non è della stessa versione, controlla se la tua macchina locale aveva una versione diversa da quella che hai impacchettato.

Verifica eventuali problemi relativi ai file JAR

Verifica se la tua funzione viene eseguita come previsto su una macchina locale o da un'applicazione Modello di applicazione serverless AWS (AWS SAM). Se la funzione fallisce solo quando viene richiamata da Lambda, potrebbero esserci problemi con le dipendenze referenziate (file JAR).

Suggerimento: prendi in considerazione l'utilizzo dell'ambiente di sviluppo integrato (IDE) Eclipse per creare le tue funzioni Lambda per Java. La creazione di un progetto con l'utilizzo dei plugin disponibili in Eclipse configurerà automaticamente il progetto per una compilazione corretta. Per ulteriori informazioni, consulta la pagina Using Lambda with the AWS Toolkit for Eclipse.

Verifica quanto segue per i file JAR che si trovano in una directory locale e specificati in una variabile di ambiente Java CLASSPATH:

  • I file siano inclusi nel pacchetto di implementazione della funzione.
    Nota: se non riesci a trovare i file JAR referenziati, è possibile che non siano stati inclusi in bundle al momento della creazione del pacchetto di implementazione.
  • Le versioni dei file siano le stesse dei file nel pacchetto di implementazione.

Se mancano dei file o le loro versioni non sono corrette, copia tutte le dipendenze (file JAR) in /lib o nella directory root. Assicurati di fare riferimento alle versioni corrette. Quindi, carica i contenuti compressi.

Nota: se utilizzi uno strumento di compilazione come Apache Maven o Gradle, assicurati di utilizzare i plugin richiesti durante la creazione dell'artefatto di implementazione. Ad esempio, il plugin Apache Maven Shade.

Verifica eventuali problemi relativi alle autorizzazioni

Lambda richiede che i file del pacchetto zip abbiano autorizzazioni di lettura globali. Per ulteriori informazioni, consulta la pagina Come posso risolvere gli errori "permission denied" o "unable to import module" durante il caricamento di un pacchetto di implementazione Lambda?

Importante: dopo aver identificato e risolto i problemi, è necessario creare un bundle e caricare manualmente la funzione Lambda per implementarla. Quindi, controlla se ricevi ancora l'errore.


Informazioni correlate

Errori della funzione AWS Lambda in Java

Instrumenting Java code in AWS Lambda

Including library dependencies in a Layer

Best practices for working with AWS Lambda functions

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa