本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Fargate 上的 Java 類別載入問題進行故障診斷
在 Fargate 上執行的 Java 應用程式可能會在平台更新後遇到類別載入問題,特別是當應用程式依賴非確定性類別載入行為時。這可以顯示為相依性注入錯誤、Spring Boot 失敗,或先前部署中不存在的其他執行時間例外狀況。
徵狀
您可能會遇到下列症狀:
-
Spring Boot 相依性注入錯誤
-
ClassNotFoundException 或 NoClassDefFoundError 例外狀況
-
先前使用 Fargate 的應用程式現在會間歇性失敗
-
相同的容器映像適用於 Amazon EC2,但在 Fargate 上失敗
-
使用相同容器映像跨部署的不一致行為
原因
這些問題通常是因為下列原因發生:
-
非確定性類別載入:當基礎平台變更檔案的存取或快取方式時,取決於從 JAR 檔案載入類別順序的 Java 應用程式可能會失敗。
-
平台更新:Fargate 平台版本更新可能會變更基礎檔案系統行為,影響探索和載入類別的順序。
-
JAR 檔案排序相依性:在沒有明確相依性管理的情況下隱含依賴特定 JAR 載入序列的應用程式。
Resolution
若要解決 Fargate 上的 Java 類別載入問題,請實作確定性類別載入實務:
立即修正
如果您需要立即解決方法:
-
強制執行 JAR 載入順序:明確指定應該在應用程式的 classpath 組態中載入 JAR 檔案的順序。
-
使用明確相依性管理:確保在建置組態 (Maven、Gradle 等) 中明確宣告所有相依性,而不是依賴暫時性相依性。
長期最佳實務
實作這些實務,以防止未來的類別載入問題:
-
讓類別載入具有決定性:
-
在建置檔案中使用明確相依性宣告
-
避免依賴 classpath 掃描順序
-
使用相依性管理工具來解決版本衝突
-
使用 Java 虛擬機器 (JVM) 選項,例如
-verbose:class
來取得 JVM 載入類別的相關資訊。
-
-
Spring Boot 應用程式:
-
@ComponentScan
搭配明確的基本套件使用 -
明確設定 Bean 以避免自動設定衝突
-
使用
@DependsOn
註釋控制 bean 初始化順序
-
-
組建組態:
-
在 Maven 或 Gradle 中使用相依性管理區段
-
排除造成衝突的暫時性相依性
-
使用 Maven Enforcer Plugin 等工具來偵測相依性問題
-
-
測試:
-
使用不同的 JVM 實作測試您的應用程式
-
執行模擬不同部署環境的整合測試
-
使用工具分析開發期間的 classpath 衝突
-
預防
若要防止未來部署中的 Java 類別載入問題:
-
遵循決定性類別載入實務:設計您的應用程式,使其不取決於從 classpath 載入類別的順序。
-
使用明確相依性管理:一律在您的建置組態中明確宣告所有必要的相依性及其版本。
-
跨環境測試:定期跨不同環境和平台版本測試應用程式,以及早識別潛在問題。
-
監控平台更新:隨時掌握 Fargate 平台更新,並在新平台版本影響生產工作負載之前測試您的應用程式。