提问者:小点点

System. getenv()在环境变量存在时返回null[重复]


我试图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"

当我打印出varValue的值时,会打印“null”。

这可能是什么原因?

编辑:我按照这里的顶部答案,重新启动了Eclipse,它起作用了!


共1个答案

匿名用户

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

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

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

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

P. S.

>

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

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

    还有其他方法可以定义永久环境变量。您可以在此处查看更多信息。