macOS Catalina系统Java读取环境变量返回null问题咨询
问题原因分析
1. 启动上下文未继承shell环境变量(最常见原因)
你在.bash_profile中配置的环境变量属于shell会话级别的变量,仅对终端内启动的shell进程、以及从该终端窗口启动的子进程生效。如果你的Java程序符合以下任意一种启动场景,就会读不到该变量:
- 从IDEA、Eclipse、VS Code等图形化IDE中直接启动
- 从Launchpad、Spotlight、Dock中点击启动
- 通过launchd配置成后台服务运行
macOS下图形界面程序默认不会加载用户的shell配置文件,因此进程的环境变量列表中不存在你配置的LOG_PATH。
验证方法
在可以正常执行printenv LOG_PATH拿到结果的终端窗口中,直接用java命令运行你的测试类即可验证:
System.out.println("LOG PATH="+System.getenv("LOG_PATH"));
如果此时可以正常输出变量值,即可确认是启动上下文的问题,和Java代码无关。
2. shell配置文件加载范围不匹配
macOS Catalina 10.15.x开始,系统默认的shell从bash改为了zsh:
.bash_profile是bash的专属配置文件,仅在启动bash会话时会加载- 如果你终端默认使用zsh,你能在终端看到变量大概率是手动执行过
source .bash_profile,重启终端后该变量就会失效,需要将变量配置到zsh的对应配置文件~/.zprofile或者~/.zshrc中才能永久生效。
3. 程序运行用户不一致
如果你的Java程序使用sudo切换用户启动,或者配置为其他用户权限的后台服务,运行用户和你配置环境变量的登录用户不一致,自然无法读取到对应用户的私有配置变量。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

