Como soluciono os erros "ClassNotFoundException" e "NoSuchMethodError" de uma função Java do Lambda?

5 minuto de leitura
0

Quando tento invocar minha função Java do AWS Lambda, recebo os erros "ClassNotFoundException" ou "NoSuchMethodError". Como resolvo esses erros?

Breve descrição

O erro ClassNotFoundException ocorre quando um runtime Java carrega uma classe com base em seu nome totalmente qualificado, mas não localiza essa classe.

Observação: um nome de classe totalmente qualificado em Java inclui o pacote de implantação e o nome da classe.

O erro NoSuchMethodError ocorre quando uma versão de dependência referenciada é diferente da versão no pacote.

Para obter mais informações sobre a estrutura do pacote de implantação da função Java do Lambda, consulte Deploy Java Lambda functions with .zip or JAR file archives.

Resolução

Observação: se houver algum erro ao executar comandos da AWS Command Line Interface (AWS CLI), verifique se você estar usando a versão mais recente da AWS CLI.

Baixar o pacote de implantação da função do Lambda

Para visualizar a estrutura de arquivos do pacote de implantação da função do Lambda, faça o seguinte:

Para baixar o pacote de implantação da função executando o comando zipinfo

Execute o seguinte comando zipinfo:

Importante: substitua my-deployment-package.zip pelo nome do arquivo do pacote de implantação. O comando a seguir é válido somente para sistemas operacionais Linux, Unix e macOS.

$ zipinfo my-deployment-package.zip

Para baixar o pacote de implantação da função executando o comando da AWS CLI get-function do Lambda

Execute o seguinte comando get-function:

Importante: substitua my-function pelo nome da função do Lambda.

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

A saída do comando fornece uma URL pré-assinada que você pode usar para baixar o arquivo. Para obter mais informações, consulte Recuperar uma função do Lambda.

Para baixar o pacote de implantação da função no console do Lambda

1.    Na página Funções do console do Lambda, escolha sua função.

2.    Escolha Ações.

3.    Escolha Exportar função.

4.    Na caixa de diálogo Exportar sua função, escolha Fazer download do pacote de implantação.

Confirmar o nome do método do manipulador de funções

Para obter mais informações, consulte AWS Lambda function handler in Java.

Verificar se há problemas no pipeline de CI/CD

Se estiver usando um pipeline de integração contínua e entrega contínua (CI/CD) para empacotar e implantar a função, verifique o seguinte:

  • Todas as dependências necessárias foram agrupadas ao empacotar a função.
  • Todas as versões de dependências referenciadas estão corretas.
  • Qualquer URL de bucket do Amazon Simple Storage Service (Amazon S3) necessário existe e aponta para a versão mais recente de um arquivo.
    Observação: o URL do bucket do Amazon S3 é necessário se você usa uma origem de bucket do Amazon S3 e o versionamento do bucket está ativado somente.
  • As alterações no código foram implantadas antes da implantação da alteração na configuração do manipulador.
    Observação: o Lambda não tem um mecanismo para atualizar o código e a configuração em uma única alteração atômica.

Verificar se há algum problema no arquivo da classe

Verifique o seguinte para a classe nomeada no erro ClassNotFoundException:

  • Ela está incluída no pacote de implantação.
    Observação: se não conseguir encontrar a classe, talvez ela não tenha sido agrupada quando você criou o pacote de implantação.
  • O nome da classe agrupada é o mesmo que o valor do manipulador da função.
  • Ela está localizada em /lib ou no diretório raiz.
  • Se for referenciada como uma camada do Lambda, seu conteúdo não foi extraído para um diretório diferente de java/lib.
  • A versão é a mesma da classe empacotada com a função. Se a classe não for da mesma versão, verifique se sua máquina local tinha uma versão diferente daquela que você empacotou.

Verificar se há algum problema no arquivo JAR

Confirme se a função é executada conforme o esperado em uma máquina local ou em uma aplicação AWS Serverless Application Model (AWS SAM). Se a função falha somente quando invocada do Lambda, talvez haja problemas com dependências referenciadas (arquivos JAR).

Dica: considere usar o ambiente de desenvolvimento integrado (IDE) Eclipse para criar suas funções Java do Lambda. Criar um projeto usando os plug-ins disponíveis no Eclipse configura automaticamente esse projeto para uma compilação adequada. Para obter mais informações, consulte Usar Lambda com o AWS Toolkit for Eclipse.

Verifique o seguinte para arquivos JAR localizados em um diretório local e especificados em uma variável de ambiente Java CLASSPATH:

  • Os arquivos estão incluídos no pacote de implantação da função.
    Observação: se você não conseguir encontrar arquivos JAR referenciados, talvez eles não tenham sido agrupados quando você criou o pacote de implantação.
  • As versões dos arquivos são as mesmas das dos arquivos no pacote de implantação.

Se arquivos estiverem ausentes ou suas versões estiverem incorretas, copie todas as dependências (arquivos JAR) para /lib ou para o diretório raiz. Certifique-se de fazer referência às versões corretas. Em seguida, faça upload do conteúdo compactado.

Observação: se estiver usando uma ferramenta de compilação, como o Apache Maven ou o Gradle, certifique-se de usar os plug-ins necessários ao criar o artefato de implantação. Por exemplo, o Plug-in Apache Maven Shade.

Verificar se há problemas de permissão

O Lambda exige que os arquivos do pacote zip tenham permissões globais de leitura. Para obter mais informações, consulte Como soluciono os problemas de erros do Lambda de "permissão negada" ou "não é possível importar módulo" ao fazer o upload de um pacote de implantação do Lambda?

Importante: depois de identificar e corrigir os problemas, você deve agrupar e carregar manualmente a função do Lambda para implantá-la. Em seguida, verifique se você ainda recebe o erro.


Informações relacionadas

AWS Lambda function errors in Java

Instrumenting Java code in AWS Lambda

Including library dependencies in a Layer

Best practices for working with AWS Lambda functions

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos