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.
显然,如果您重新启动计算机,您在 shell 上定义的环境变量将不会被保存,因为您在 shell 进程上定义了变量会消失的。
如果使用bash,则通过在文件~/.bashrc
中添加环境变量设置命令,每次执行bash 进程启动时,您可以模拟永久环境变量的行为。
还有其他方法可以定义永久环境变量。您可以查看here了解更多信息。
我正在尝试 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.
显然,如果您重新启动计算机,您在 shell 上定义的环境变量将不会被保存,因为您在 shell 进程上定义了变量会消失的。
如果使用bash,则通过在文件
~/.bashrc
中添加环境变量设置命令,每次执行bash 进程启动时,您可以模拟永久环境变量的行为。还有其他方法可以定义永久环境变量。您可以查看here了解更多信息。