首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 獲取環境變量與系統屬性完整指南

     編輯:Java 相關知識

核心概念區分

維度環境變量系統屬性
來源操作系統級(Windows 注冊表、Linux /etc/profile)JVM 運行時內部維護
作用域進程及其子進程可見(全局)僅當前 JVM 進程可見
大小寫Windows 不敏感,Linux 敏感嚴格區分大小寫
典型用途PATH、JAVA_HOME、DATABASE_URLjava.version、file.encoding、user.dir
APISystem.getenv()System.getProperty()

環境變量操作

// 獲取所有環境變量(Map,不可修改)
Map env = System.getenv();
env.forEach((k, v) -> System.out.println(k + "=" + v));

// 獲取單個(推薦)
String javaHome = System.getenv("JAVA_HOME");
String path = System.getenv("PATH");

// ⚠️ Java 無法直接修改進程環境變量
// 僅能在創建子進程時指定:
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "echo %JAVA_HOME%");
pb.environment().put("MY_VAR", "custom_value");
Process process = pb.start();

系統屬性操作

// 獲取所有(Properties 對象,可修改)
Properties props = System.getProperties();
props.forEach((k, v) -> System.out.println(k + "=" + v));

// 獲取單個(支持默認值)
String version = System.getProperty("java.version");
String encoding = System.getProperty("file.encoding", "UTF-8"); // 默認值

// 設置系統屬性(僅影響當前 JVM)
System.setProperty("my.app.config", "/opt/config");
System.setProperty("log.level", "DEBUG");

// 命令行啟動時指定(推薦配置方式)
// java -Dfile.encoding=UTF-8 -Dmy.config=/path -jar app.jar

常用系統屬性速查表

屬性名含義示例值
java.versionJRE 版本17.0.9
java.homeJRE 安裝目錄/usr/lib/jvm/java-17-openjdk
java.class.path類路徑.:/app/lib/*
java.library.path原生庫搜索路徑/usr/lib
java.io.tmpdir臨時文件目錄/tmp
os.name操作系統名稱Linux / Windows 10
os.archOS 架構amd64 / aarch64
file.separator文件分隔符/ 或 \
path.separator路徑分隔符: 或 ;
line.separator行分隔符\n 或 \r\n
user.name當前用戶名admin
user.home用戶主目錄/home/admin
user.dir工作目錄/app

實戰最佳實踐

1. 配置優先級鏈(Spring Boot 風格)

// 1. 默認值(代碼內)
// 2. 系統屬性 -Dxxx
// 3. 環境變量 XXX_YYY
// 4. 配置文件 application.yml
// 5. 命令行參數 --xxx=yyy

String value = System.getProperty("app.config");
if (value == null) value = System.getenv("APP_CONFIG");
if (value == null) value = "default";

2. 容器化部署規範

  • 敏感配置(密碼、密鑰)只用環境變量,掛載 Secret
  • 應用行為配置(日誌級別、線程池大小)用系統屬性 -D
  • Dockerfile 中 ENV JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms512m -Xmx1g"

3. 安全管理器影響

// 受 SecurityManager 限制時會拋出 AccessControlException
System.setSecurityManager(new SecurityManager());
System.getProperties(); // 拋出異常:checkPropertiesAccess
// 解決:授權 policy 文件或移除 SecurityManager(現代框架多不使用)

4. log4j2 / Logback 變量替換

<!-- log4j2.xml -->
<Property name="LOG_DIR">${sys:user.home}/logs</Property> <!-- 系統屬性 -->
<Property name="LOG_DIR">${env:LOG_DIR}</Property> <!-- 環境變量 -->
<Appender type="RollingFile" fileName="${LOG_DIR}/app.log"/>

總結

  • 環境變量:跨進程、跨語言、部署層面配置,只讀
  • 系統屬性:JVM 內部運行參數,可讀寫,啟動時 -D 指定最佳
  • 配置獲取遵循優先級鏈,代碼中提供合理默認值
  • 容器化場景嚴格區分敏感/非敏感配置存儲方式

清晰區分兩者邊界,是構建可移植、可配置、安全的 Java 應用基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved