¿Cómo puedo solucionar los errores «ClassNotFoundException» y «NoSuchMethodError» de una función de Lambda de Java?
Cuando intento invocar mi función de AWS Lambda de Java, aparecen los errores «ClassNotFoundException» o «NoSuchMethodError». ¿Cómo puedo solucionar estos errores?
Breve descripción
El error ClassNotFoundException se produce cuando una versión ejecutable de Java carga una clase por su nombre completo, pero no la ubica.
Nota: En Java, un nombre de clase completo incluye el paquete de despliegue y el nombre de la clase.
El error NoSuchMethodError se produce cuando una versión de dependencia a la que se hace referencia difiere de la versión del paquete.
Para obtener más información sobre la estructura del paquete de despliegue de la función de Lambda de Java, consulte Deploy Java Lambda functions with .zip or JAR file archives.
Solución
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), asegúrese de utilizar la versión más reciente de AWS CLI.
Descarga del paquete de despliegue de la función de Lambda
Para ver la estructura de archivos del paquete de despliegue de la función de Lambda, elija una de las siguientes opciones:
Para descargar el paquete de despliegue de la función mediante la ejecución del comando zipinfo
Ejecute el siguiente comando zipinfo:
Importante: Sustituya my-deployment-package.zip por el nombre del archivo del paquete de despliegue. El siguiente comando solo es válido para los sistemas operativos Linux, Unix y macOS.
$ zipinfo my-deployment-package.zip
Para descargar el paquete de despliegue de la función mediante la ejecución del comando de la AWS CLI get-function de Lambda
Ejecute el siguiente comando get-function:
Importante: Sustituya my-function por el nombre de la función de Lambda.
aws lambda get-function \ --function-name my-function
El resultado del comando proporciona una URL prefirmada que puede usar para descargar el archivo. Para obtener más información, consulte Retrieve a Lambda function.
Para descargar el paquete de despliegue de la función desde la consola de Lambda
1. Elija su función en la página Funciones de la consola de Lambda.
2. Elija Acciones.
3. Seleccione Exportar la función.
4. En el cuadro de diálogo Exportar la función, seleccione Descargar paquete de despliegue.
Confirmación del nombre del método del controlador de funciones
Para obtener más información, consulte AWS Lambda function handler in Java.
Comprobación de los posibles problemas en la canalización de CI/CD
Si utiliza una canalización de integración y entrega continuas (CI/CD) para empaquetar y desplegar la función, compruebe lo siguiente:
- Todas las dependencias necesarias se incluyeron al empaquetar la función.
- Todas las versiones de dependencia a las que se hace referencia son correctas.
- Existen las URL de bucket de Amazon Simple Storage Service (Amazon S3) que se necesitan y señalan a la versión más reciente de un archivo.
Nota: La URL de bucket de Amazon S3 es necesaria si utiliza un origen de bucket de Amazon S3 y solo se ha activado el control de versiones de bucket. - Los cambios de código se desplegaron antes del despliegue del cambio de configuración del controlador.
Nota: Lambda no cuenta con un mecanismo para actualizar el código y la configuración en un solo cambio atómico.
Comprobación de los posibles problemas con el archivo de la clase
Verifique lo siguiente respecto a la clase mencionada en el error ClassNotFoundException:
- Está incluida en el paquete de despliegue.
Nota: Si no encuentra la clase, es posible que no se incluyera cuando creó el paquete de despliegue. - El nombre de la clase empaquetada coincide con el valor del controlador de la función.
- Se encuentra en el directorio /lib o en el directorio raíz.
- Si se hace referencia a ella como una capa de Lambda, su contenido no se extrajo a otro directorio distinto de java/lib.
- Es la misma versión que la clase empaquetada con la función. Si la versión de la clase es distinta, compruebe si la máquina local tenía otra versión diferente a la que empaquetó.
Comprobación de los posibles problemas con el archivo JAR
Confirme si la función se ejecuta según lo previsto en una máquina local o desde una aplicación de AWS Serverless Application Model (AWS SAM). Si la función solo falla cuando se invoca desde Lambda, es posible que haya problemas con las dependencias a las que se hace referencia (archivos JAR).
Consejo: Plantéese utilizar el entorno de desarrollo integrado (IDE) de Eclipse para compilar las funciones de Lambda de Java. Al crear un proyecto con los complementos disponibles en Eclipse, el proyecto se configura automáticamente para una compilación adecuada. Para obtener más información, consulte Using Lambda with the AWS Toolkit for Eclipse.
Compruebe lo siguiente respecto a los archivos JAR en un directorio local que se especifican en una variable de entorno CLASSPATH de Java:
- Los archivos están incluidos en el paquete de despliegue de la función.
Nota: Si no encuentra los archivos JAR a los que se hace referencia, es posible que no se incluyera cuando creó el paquete de despliegue. - Las versiones de los archivos coinciden con las de los archivos del paquete de despliegue.
Si faltan archivos o sus versiones son incorrectas, copie todas las dependencias (archivos JAR) en el directorio /lib o en el directorio raíz. Asegúrese de hacer referencia a las versiones correctas. A continuación, cargue el contenido comprimido.
Nota: Si utiliza una herramienta de compilación como Apache Maven o Gradle, asegúrese de usar los complementos necesarios cuando compile el artefacto de despliegue. Por ejemplo, el complemento Maven Shade de Apache.
Comprobación de los posibles problemas con los permisos
Lambda requiere que los archivos de paquetes comprimidos tengan permisos de lectura globales. Para obtener más información, consulte: ¿Cómo soluciono los errores «permiso denegado» o «no se puede importar el módulo» al cargar un paquete de despliegue de Lambda?
Importante: Después de identificar y corregir los problemas, deberá empaquetar y cargar manualmente la función de Lambda para desplegarla. A continuación, compruebe si el error persiste.
Información relacionada
AWS Lambda function errors in Java
Instrumenting Java code in AWS Lambda
Contenido relevante
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 2 años