本文為 J2EE 環境配置 J2SE 系列的第四部分,主要說明應用伺服器整合 JDK 的進階設定與驗證步驟。由於原始內容較少,這裡補充完整配置指南。
主流應用伺服器皆提供指定 JDK 的機制:
JAVA_HOME 環境變數,或修改 catalina.sh/bat 中的 JAVA_HOME 變數。setDomainEnv.sh/cmd 中設定 JAVA_HOME 與 JAVA_VENDOR。JAVA_HOME 或在 standalone.conf 中指定。asenv.conf 設定 AS_JAVA。確保專案原始碼編碼版本與目標執行環境一致:
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target>sourceCompatibility = 1.8; targetCompatibility = 1.8;JDK 9 引入模組系統,舊應用可能需:
--add-modules 參數(如 java.se.ee 模組)。--add-opens 開放內部 API 存取(如 java.base/java.lang=ALL-UNNAMED)。java.corba, java.transaction),改用獨立庫。常見 JVM 參數範例(視應用負載調整):
-Xms2g -Xmx4g # 堆大小
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m # 元空間
-XX:+UseG1GC # G1 收集器 (JDK 9+ 預設)
-XX:MaxGCPauseMillis=200 # 目標停頓
-Xlog:gc*:file=gc.log:time,uptime,level,tags # GC 日誌 (JDK 9+ 統一日誌)
java.version, java.home, java.vm.version。System.getProperty("java.version") 確認運行時 JDK。jcmd <pid> VM.flags 檢查實際生效的 JVM 參數。| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| UnsupportedClassVersionError | 編譯版本高於運行版本 | 降低編譯 target 或升級運行 JDK |
| NoClassDefFoundError (java.se.ee) | JDK 9+ 缺少 EE 模組 | 添加 --add-modules 或引入獨立 API jar |
| 存取內部 API 失敗 | 強封裝限制 | --add-opens 開放對應包 |
| GC 停頓過長 | 堆大小/收集器不當 | 調整 -Xmx、切換收集器、調優 G1 參數 |