Java Lambda 함수에서 발생하는 “ClassNotFoundException” 및 “NoSuchMethodError” 오류를 해결하려면 어떻게 해야 하나요?

4분 분량
0

Java AWS Lambda 함수를 호출하려고 하면 “ClassNotFoundException” 또는 “NoSuchMethodError” 오류가 발생합니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명


ClassNotFoundException 오류는 Java 런타임이 정규화된 이름으로 클래스를 로드하나 찾지 못하는 경우 발생합니다.

참고: 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 콘솔의 함수 페이지에서 함수를 선택합니다.

  2. 작업을 선택합니다.

  3. 함수 내보내기를 선택합니다.

  4. 함수 내보내기 대화 상자에서 배포 패키지 다운로드를 선택합니다.

함수 처리기 메서드 이름 확인

자세한 내용은 Java의 AWS Lambda 함수 처리기를 참고하세요.

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

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

  • 함수를 패키징할 때 모든 필수 종속성을 번들했습니다.
  • 참조된 종속성 버전이 모두 정확합니다.
  • Amazon Simple Storage Service(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 배포 패키지를 업로드할 때 “permission denied” 또는 “unable to import module” 오류를 해결하려면 어떻게 해야 하나요?를 참고하세요.

중요: 문제를 파악하고 해결한 후에는 수동으로 Lambda 함수를 번들링하고 업로드해 배포해야 합니다. 그 후 오류가 해결되었는지 확인하세요.


관련 정보

Java의 AWS Lambda 함수 오류

AWS Lambda에서 Java 코드 계측

Layer에 라이브러리 종속성 포함

AWS Lambda 함수 작업의 모범 사례

AWS 공식
AWS 공식업데이트됨 2년 전