| 維度 | 系統屬性 | 環境變數 |
| 來源 | JVM 啟動參數 -Dkey=value、預設值 | 作業系統行程環境區塊 |
| 範圍 | JVM 進程內 | 行程樹繼承 (父進程→子進程) |
| 可變性 | 執行期可修改 System.setProperty | 唯讀 (Java 無標準 API 修改) |
| 跨平台一致性 | 高 (JVM 定義標準鍵) | 低 (Windows/Unix 鍵名大小寫、存在性不同) |
| 典型用途 | 應用配置、JVM 診斷、路徑解析 | 外部工具鏈定位、容器配置注入、CI/CD 參數 |
4. 最佳實務
- 配置外部化:啟動腳本用
-Dapp.config=/etc/app/config.yml 傳入,程式碼 System.getProperty("app.config") 讀取。
- 編碼明確化:啟動加
-Dfile.encoding=UTF-8,避免平台預設編碼差異導致中文亂碼。
- 路徑用
File.separator:String path = System.getProperty("user.home") + File.separator + ".myapp"。
- 環境變數作為覆蓋層:
String val = System.getProperty("key", System.getenv("KEY")) (Java 8+ getProperty 無預設值多載,需自行判斷)。
- 安全性:勿在日誌輸出完整
System.getProperties(),可能洩露 java.class.path 內含密鑰路徑等敏感資訊。
5. 完整示例:環境診斷工具類
public final class EnvDiagnostics {
public static void printSummary() {
System.out.println("=== JVM System Properties ===");
printProps(System.getProperties(), Arrays.asList(
"java.version", "java.home", "java.class.path", "java.library.path",
"os.name", "os.arch", "os.version",
"user.name", "user.home", "user.dir",
"file.encoding", "file.separator", "path.separator", "line.separator"
));
System.out.println("\n=== OS Environment Variables ===");
printProps(System.getenv(), Arrays.asList(
"PATH", "JAVA_HOME", "CLASSPATH", "TEMP", "TMP",
"USERPROFILE", "HOME", "LANG", "LC_ALL"
));
}
private static void printProps(Map, ?> props, Collection> keys) {
for (Object k : keys) {
Object v = props.get(k);
System.out.printf("%-30s --> %s%n", k, v != null ? v : "");
}
}
}
掌握上述 API 與鍵值對照,即能快速診斷部署環境、編寫跨平台相容的路徑與配置邏輯。
- 上一篇文章: Java 中文數字混排字串自然排序:正則提取數字組、Comparable 實作與單元測試完整範例
- 下一篇文章: C++ 裸指標 vs unique_ptr vs shared_ptr 效能實測:300 萬次佇列操作、自訂 new/delete 統計、移動語義優化
Copyright ©
程式碼之家 All Rights Reserved