Comment résoudre les erreurs « ClassNotFoundException » et « NoSuchMethodError » d'une fonction Lambda Java ?

Dernière mise à jour : 03/02/2022

Lorsque je tente d'appeler ma fonction AWS Lambda Java, je reçois des erreurs « ClassNotFoundException » ou « NoSuchMethodError ». Comment résoudre ce problème ?

Brève description

L'erreur ClassNotFoundException se produit lorsqu'un environnement d'exécution Java charge une classe par son nom complet, mais ne la localise pas.

Remarque : un nom de classe complet en Java inclut le package de déploiement et le nom de la classe.

L'erreur NoSuchMethodError se produit lorsqu'une version de dépendance référencée est différente de la version packagée.

Pour plus d'informations sur la structure du package de déploiement de fonctions Lambda Java, consultez la section Déployer des fonctions Lambda Java à l'aide d'archives de fichiers .zip ou JAR.

Résolution

Remarque : si vous recevez des erreurs lors de l'exécution de commandes à partir de l'AWS Command Line Interface (AWS CLI), assurez-vous d'utiliser la version la plus récente de l'interface.

Téléchargement du package de déploiement de votre fonction Lambda

Effectuez l'une des actions suivantes pour afficher la structure de fichier du package de déploiement de votre fonction Lambda :

Pour télécharger le package de déploiement de votre fonction en exécutant la commande zipinfo

Exécutez la commande zipinfo suivante :

Important : remplacez my-deployment-package.zip par le nom du fichier de votre package de déploiement. Les commandes suivantes fonctionnent uniquement pour les systèmes d'exploitation Linux, Unix et macOS.

$ zipinfo my-deployment-package.zip

Pour télécharger le package de déploiement de votre fonction en exécutant la commande Lambda get-function dans l'AWS CLI

Exécutez la commande get-function suivante :

Important : remplacez my-function par le nom de votre fonction Lambda.

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

La sortie de la commande affiche une URL pré-signée que vous pouvez utiliser pour télécharger le fichier. Pour plus d'informations, consultez la section Récupérer une fonction Lambda.

Pour télécharger le package de déploiement de votre fonction depuis la console Lambda

1.    Sur la page Fonctions de la console Lambda, choisissez votre fonction.

2.    Choisissez Actions.

3.    Choisissez la fonction Export (Exporter).

4.    Dans la boîte de dialogue Export your function (Exporter votre fonction), choisissez Download deployment package (Télécharger le package de déploiement).

Vérification du nom de méthode du gestionnaire de fonction

Pour plus d'informations, consultez la section Gestionnaire de fonctions AWS Lambda dans Java.

Vérification des problèmes liés aux pipelines CI/CD

Si vous utilisez un pipeline d'intégration et de livraison continue (CI/CD) pour empaqueter et déployer votre fonction, vérifiez les points suivants :

  • Toutes les dépendances requises ont été regroupées lors de l'empaquetage de la fonction.
  • Toutes les versions de dépendances référencées sont correctes.
  • Toutes les URL de compartiment Amazon Simple Storage Service (Amazon S3) requises existent et pointent vers la dernière version du fichier correspondant.
    Remarque : l'URL du compartiment Amazon S3 n'est requise que si vous utilisez une source de compartiment Amazon S3 et si la gestion des versions de compartiment est activée.
  • Les modifications de code ont été déployées avant le déploiement de la modification de configuration du gestionnaire.
    Remarque : Lambda ne dispose d'aucun mécanisme de mise à jour du code et de la configuration en une modification atomique.

Vérification des problèmes liés aux fichiers de classe

Vérifiez les éléments suivants pour la classe indiquée dans l'erreur ClassNotFoundException :

  • Elle est incluse dans le package de déploiement.
    Remarque : si vous ne trouvez pas la classe, elle n'a peut-être pas été regroupée lorsque vous avez créé le package de déploiement.
  • Son nom de classe groupée est identique à la valeur renseignée pour le gestionnaire de votre fonction.
  • Elle se trouve dans le répertoire /lib ou dans le répertoire racine.
  • Si elle est référencée en tant que couche Lambda, son contenu n'a pas été extrait vers un répertoire autre que java/lib.
  • Il s'agit de la même version que la classe empaquetée avec votre fonction. Si la classe n'est pas la même version, vérifiez si votre ordinateur local exécute une version différente de la version empaquetée.

Vérification des problèmes liés aux fichiers JAR

Vérifiez que votre fonction s'exécute comme prévu sur un ordinateur local ou à partir d'une application AWS Serverless Application Model (AWS SAM). Si votre fonction échoue uniquement lorsqu'elle est appelée à partir de Lambda, les dépendances référencées (fichiers JAR) peuvent être à l'origine du problème.

Conseil : envisagez d'utiliser l'environnement de développement intégré (IDE) Eclipse pour créer vos fonctions Lambda Java. La création d'un projet à l'aide de plug-ins disponibles dans Eclipse configure automatiquement votre projet pour une compilation appropriée. Pour plus d'informations, consultez la section Utilisation de Lambda avec AWS Toolkit for Eclipse.

Vérifiez les éléments suivants pour les fichiers JAR situés dans un répertoire local et spécifiés dans une variable d'environnement Java CLASSPATH :

  • Les fichiers sont inclus dans le package de déploiement de votre fonction.
    Remarque : si vous ne trouvez pas les fichiers JAR référencés, ils n'ont peut-être pas été regroupés lorsque vous avez créé le package de déploiement.
  • Les versions de fichier sont les mêmes que les fichiers du package de déploiement.

Si des fichiers sont manquants ou si leurs versions sont incorrectes, copiez toutes les dépendances (fichiers JAR) dans le répertoire /lib ou dans le répertoire racine. Assurez-vous que vous référencez les versions correctes. Chargez ensuite le contenu compressé.

Remarque : si vous utilisez un outil de création tel qu'Apache Maven ou Gradle, assurez-vous d'utiliser les plugins requis lors de la création de l'artefact de déploiement, comme le plugin Apache Maven Shade.

Vérification des problèmes liés aux autorisations

Lambda nécessite que les fichiers de packages .zip disposent d'autorisations de lecture globales. Pour plus d'informations, consultez la section Comment résoudre les erreurs « permission denied » (autorisation refusée) ou « unable to import module » (impossible d'importer le module) dans Lambda lors du chargement d'un package de déploiement Lambda ?

Important : après avoir identifié et résolu les problèmes, vous devez regrouper et charger votre fonction Lambda manuellement pour la déployer. Vérifiez ensuite si le message d'erreur persiste.