System.getenv() returns 环境变量存在时为null

System.getenv() returns null when the environment variable exists

我正在尝试 System.getenv() 获取我通过终端 (Mac) 设置的环境变量的值,我也在我的 .bash_profile 中设置了该变量文件并重新加载。这样做之后,我回显了该值并将正确的值打印到终端。尝试检索变量的值时(我确保在我的 .bash_profile 文件中和使用 System.getenv().

时都使用了正确的名称

在下面的代码中,我将变量名替换为 VAR_NAME:

String varValue = System.getenv("VAR_NAME");
System.out.println("Value: " + varValue);

在我的.bash_profile:

export VAR_NAME="foo"

"null" 当我打印出 varValue.

的值时打印出来

这可能是什么原因?

编辑: 我遵循了最佳答案 here,重新启动了 Eclipse 并且成功了!

这个问题的答案比 Java 中的 System.getenv() 更笼统。

每个进程都有自己独立的环境变量副本,而环境变量只在进程树中向下,只有在创建子进程时才会从父进程复制到子进程。在您的情况下,您的 shell 本身是一个进程,started/created Eclipse 进程。因此,Eclipse 是 shell 的 子进程 ,因此,在 Eclipse 实例上定义的环境变量是在 shell 当您启动 Eclipse 时

您可能在 shell 启动 Eclipse 之后 定义了环境变量。因此,Eclipse 和它创建的 Java 子进程永远不会“知道”您的新环境变量。

由于这种行为,实际上这里的解决方案是退出 Eclipse 并从您的 shell 重新启动它,其中已经定义了环境变量 。另一种选择是转到项目的 运行 配置并在那里定义环境变量。

P.S.

  1. 显然,如果您重新启动计算机,您在 shell 上定义的环境变量将不会被保存,因为您在 shell 进程上定义了变量会消失的。

  2. 如果使用bash,则通过在文件~/.bashrc中添加环境变量设置命令,每次执行bash 进程启动时,您可以模拟永久环境变量的行为。

  3. 还有其他方法可以定义永久环境变量。您可以查看here了解更多信息。