針對 Fargate 上的 Java 類別載入問題進行故障診斷 - Amazon Elastic Container Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

針對 Fargate 上的 Java 類別載入問題進行故障診斷

在 Fargate 上執行的 Java 應用程式可能會在平台更新後遇到類別載入問題,特別是當應用程式依賴非確定性類別載入行為時。這可以顯示為相依性注入錯誤、Spring Boot 失敗,或先前部署中不存在的其他執行時間例外狀況。

徵狀

您可能會遇到下列症狀:

  • Spring Boot 相依性注入錯誤

  • ClassNotFoundException 或 NoClassDefFoundError 例外狀況

  • 先前使用 Fargate 的應用程式現在會間歇性失敗

  • 相同的容器映像適用於 Amazon EC2,但在 Fargate 上失敗

  • 使用相同容器映像跨部署的不一致行為

原因

這些問題通常是因為下列原因發生:

  • 非確定性類別載入:當基礎平台變更檔案的存取或快取方式時,取決於從 JAR 檔案載入類別順序的 Java 應用程式可能會失敗。

  • 平台更新:Fargate 平台版本更新可能會變更基礎檔案系統行為,影響探索和載入類別的順序。

  • JAR 檔案排序相依性:在沒有明確相依性管理的情況下隱含依賴特定 JAR 載入序列的應用程式。

Resolution

若要解決 Fargate 上的 Java 類別載入問題,請實作確定性類別載入實務:

立即修正

如果您需要立即解決方法:

  1. 強制執行 JAR 載入順序:明確指定應該在應用程式的 classpath 組態中載入 JAR 檔案的順序。

  2. 使用明確相依性管理:確保在建置組態 (Maven、Gradle 等) 中明確宣告所有相依性,而不是依賴暫時性相依性。

長期最佳實務

實作這些實務,以防止未來的類別載入問題:

  1. 讓類別載入具有決定性:

    • 在建置檔案中使用明確相依性宣告

    • 避免依賴 classpath 掃描順序

    • 使用相依性管理工具來解決版本衝突

    • 使用 Java 虛擬機器 (JVM) 選項,例如 -verbose:class 來取得 JVM 載入類別的相關資訊。

  2. Spring Boot 應用程式:

    • @ComponentScan 搭配明確的基本套件使用

    • 明確設定 Bean 以避免自動設定衝突

    • 使用@DependsOn註釋控制 bean 初始化順序

  3. 組建組態:

    • 在 Maven 或 Gradle 中使用相依性管理區段

    • 排除造成衝突的暫時性相依性

    • 使用 Maven Enforcer Plugin 等工具來偵測相依性問題

  4. 測試:

    • 使用不同的 JVM 實作測試您的應用程式

    • 執行模擬不同部署環境的整合測試

    • 使用工具分析開發期間的 classpath 衝突

預防

若要防止未來部署中的 Java 類別載入問題:

  • 遵循決定性類別載入實務:設計您的應用程式,使其不取決於從 classpath 載入類別的順序。

  • 使用明確相依性管理:一律在您的建置組態中明確宣告所有必要的相依性及其版本。

  • 跨環境測試:定期跨不同環境和平台版本測試應用程式,以及早識別潛在問題。

  • 監控平台更新:隨時掌握 Fargate 平台更新,並在新平台版本影響生產工作負載之前測試您的應用程式。