Java Lambda 함수에서 ‘ClassNotFoundException’ 및 ‘NoSuchMethodError’ 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 2월 3일

Java AWS Lambda 함수를 호출하려고 할 때 ‘ClassNotFoundException’ 또는 ‘NoSuchMethodError’ 오류가 발생합니다. 이러한 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

Java 런타임에서 정규화된 이름을 기준으로 클래스를 로드할 때 클래스를 찾지 못하면 ClassNotFoundException 오류가 발생합니다.

참고: Java의 정규화된 클래스 이름에는 클래스의 배포 패키지와 클래스 이름이 포함됩니다.

참조된 종속성 버전이 패키지 버전과 다를 경우 NoSuchMethodError 오류가 발생합니다.

Java Lambda 함수 배포 패키지 구조에 대한 자세한 내용은 .zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포를 참조하세요.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

Lambda 함수의 배포 패키지 다운로드

Lambda 함수 배포 패키지의 파일 구조를 확인하려면 다음 중 하나를 수행합니다.

zipinfo 명령을 실행하여 함수의 배포 패키지를 다운로드하려면

다음 zipinfo 명령을 실행합니다.

중요: my-deployment-package.zip를 배포 패키지 파일 이름으로 바꿉니다. 다음 명령은 Linux, Unix 및 macOS 운영 체제에서만 유효합니다.

$ zipinfo my-deployment-package.zip

Lambda get-function AWS CLI 명령을 실행하여 함수의 배포 패키지를 다운로드하려면

다음 get-function 명령을 실행합니다.

중요: my-function을 Lambda 함수 이름으로 바꿉니다.

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

명령 출력에서는 파일을 다운로드하는 데 사용할 수 있는 미리 서명된 URL을 제공합니다. 자세한 내용은 Lambda 함수 검색을 참조하세요.

Lambda 콘솔에서 함수의 배포 패키지를 다운로드하려면

1.    Lambda 콘솔의 함수 페이지(Function page)에서 함수를 선택합니다.

2.    작업(Actions)을 선택합니다.

3.    함수 내보내기(Export function)를 선택합니다.

4.    함수 내보내기(Export your function) 대화 상자에서 배포 패키지 다운로드(Download deployment package)를 선택합니다.

함수 핸들러 메서드 이름 확인

자세한 내용은 Java의 AWS Lambda 함수 핸들러를 참조하세요.

CI/CD 파이프라인 문제 확인

지속적 통합 및 지속적 전달(CI/CD) 파이프라인을 사용하여 함수를 패키징하고 배포하는 경우 다음을 확인합니다.

  • 함수를 패키징할 때 필요한 모든 종속성이 번들링되었습니다.
  • 참조된 모든 종속성 버전이 정확합니다.
  • 모든 필수 Amazon Simple Storage Service(Amazon S3) 버킷 URL이 존재하며 파일의 최신 버전을 가리킵니다.
    참고: Amazon S3 버킷 소스를 사용하고 버킷 버전 관리가 활성화된 경우에만 Amazon S3 버킷 URL이 필요합니다.
  • 핸들러 구성 변경을 배포하기 전에 코드 변경 사항이 배포되었습니다.
    참고: Lambda에는 하나의 원자성 변경으로 코드 및 구성을 업데이트하는 메커니즘이 없습니다.

클래스 파일 문제 확인

ClassNotFoundException 오류에 이름이 명시된 클래스에 대해 다음을 확인합니다.

  • 배포 패키지에 포함되어 있습니다.
    참고: 클래스를 찾을 수 없는 경우 배포 패키지를 생성할 때 번들에 포함되지 않았을 수 있습니다.
  • 번들 클래스 이름은 함수의 핸들러 값과 동일합니다.
  • 이는 /lib 또는 루트 디렉터리에 있습니다.
  • Lambda 계층으로 참조되는 경우 해당 콘텐츠가 java/lib 이외의 디렉터리로 추출되지 않았습니다.
  • 함수와 함께 패키징된 클래스와 동일한 버전입니다. 클래스 버전이 동일하지 않은 경우 로컬 시스템에 패키징된 버전과 다른 버전이 있는지 확인합니다.

JAR 파일 문제 확인

함수가 로컬 시스템에서 또는 AWS Serverless Application Model(AWS SAM) 애플리케이션에서 예상대로 실행되는지 확인합니다. 함수가 Lambda에서 호출할 때만 실패할 경우 참조된 종속성(JAR 파일)에 문제가 있을 수 있습니다.

팁: Eclipse 통합 개발 환경(IDE)을 사용하여 Java Lambda 함수를 구축하는 것이 좋습니다. Eclipse에서 사용할 수 있는 플러그인을 활용하여 프로젝트를 생성하면 적절한 빌드에 맞게 프로젝트가 자동으로 구성됩니다. 자세한 내용은 AWS Toolkit for Eclipse와 함께 Lambda 사용을 참조하세요.

로컬 디렉터리에 있고 Java CLASSPATH 환경 변수에 지정된 JAR 파일에 대해 다음을 확인합니다.

  • 파일은 함수의 배포 패키지에 포함되어 있습니다.
    참고: 참조된 JAR 파일을 찾을 수 없는 경우 배포 패키지를 생성할 때 번들에 포함되지 않았을 수 있습니다.
  • 파일 버전은 배포 패키지의 파일과 동일합니다.

파일이 없거나 버전이 잘못된 경우 모든 종속성(JAR 파일)을 /lib 또는 루트 디렉터리에 복사합니다. 올바른 버전을 참조하는지 확인합니다. 그런 다음, 압축된 콘텐츠를 업로드합니다.

참고: Apache Maven 또는 Gradle과 같은 구축 도구를 사용하는 경우 배포 아티팩트를 빌드할 때 필요한 플러그인을 사용하는지 확인합니다. 예를 들어, Apache Maven Shade Plugin이 이에 해당합니다.

권한 문제 확인

Lambda에서 zip 패키지 파일에 글로벌 읽기 권한이 있어야 합니다. 자세한 내용은 Lambda 배포 패키지를 업로드할 때 Lambda ‘권한 거부됨’ 또는 ‘모듈을 가져올 수 없음’ 오류를 해결하려면 어떻게 해야 합니까?를 참조하세요.

중요: 문제를 식별하고 수정한 후에 수동으로 Lambda 함수를 번들로 묶고 업로드하여 배포해야 합니다. 그런 다음, 여전히 오류가 발생하는지 확인합니다.