如何對 Java Lambda 函數中的 "ClassNotFoundException" 和 "NoSuchMethodError" 錯誤進行疑難排解?

2 分的閱讀內容
0

嘗試調用 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 命令:

重要: 使用您的 Lambda 函數的名稱取代 my-function

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

命令輸出提供一個預先簽署的 URL,可用於下載檔案。如需詳細資訊,請參閱擷取 Lambda 函數

若要從 Lambda 主控台下載函數的部署套件

1.    在 Lambda 主控台的「函數」頁面上,選擇您的函數。

2.    選擇動作

3.    選擇匯出函數

4.    在匯出函數對話方塊中,選擇下載部署套件

確認函數處理程式方法名稱

如需詳細資訊,請參閱 Java 中的 AWS Lambda 函數處理程式

檢查是否有任何 CI/CD 管道問題

如果您使用持續整合和持續交付 (CI/CD) 管道來封裝和部署函數,請確認下列項目:

檢查是否有任何類別檔案問題

驗證 ClassNotFoundException 錯誤中提到的類別是否有下列情況:

  • 它包含在部署套件中。
    **注意:**如果找不到類別,則可能是在建立部署套件時沒有捆綁它。
  • 其捆綁的類別名稱與函數的處理程式值相同。
  • 它位於 /lib 或根目錄中。
  • 如果它被引用為 Lambda 圖層,則其內容不會擷取到 java/lib 以外的目錄中。
  • 它的版本與封裝至函數的類別相同。如果類別不是同一版本,請檢查您的本機電腦是否有不同於封裝的版本。

檢查是否有任何 JAR 檔案問題

確認您的函數是按預期在本機電腦上執行,還是從 AWS Serverless Application Model (SAM) 應用程式執行。如果您的函數僅在從 Lambda 調用時失敗,則可能是引用的相依性 (JAR 檔案) 有問題。

**提示:**考慮使用 Eclipse 整合式開發環境 (IDE) 來構建您的 Java Lambda 函數。使用 Eclipse 中可用的外掛程式建立專案,會自動為您的專案設定正確的構建。如需詳細資訊,請參閱搭配使用 Lambda 與 AWS Toolkit for Eclipse

對位於本機目錄中並在 Java CLASSPATH 環境變數中指定的 JAR 檔案確認下列項目:

  • 這些檔案包含在函數的部署套件中。
    **注意:**如果找不到引用的 JAR 檔案,則可能是在建立部署套件時未捆綁它們。
  • 檔案版本與部署套件中的檔案相同。

如果檔案遺失或其版本不正確,請將所有相依性 (JAR 檔案) 複製到 /lib 或根目錄。請確保引用正確的版本。然後上傳壓縮的內容。

**注意:**如果您使用 Apache Maven 或 Gradle 等構建工具,請確保在構建部署成品時使用所需的外掛程式。例如,Apache Maven Shade 外掛程式

檢查是否有任何權限問題

Lambda 要求 zip 套件檔案具有全域讀取權限。如需詳細資訊,請參閱如何對上傳 Lambda 部署套件時的 Lambda "permission denied" 或 "unable to import module" 錯誤進行疑難排解?

**重要:**識別並修正問題後,必須手動捆綁並上傳 Lambda 函數以進行部署。然後,檢查是否仍然收到錯誤。


相關資訊

Java 中的 AWS Lambda 函數錯誤

在 AWS Lambda 中編入 Java 程式碼

在圖層中包括資源庫相依性

使用 AWS Lambda 函數的最佳做法

AWS 官方
AWS 官方已更新 2 年前