嘗試調用 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 函數的最佳做法