当环境变量存在时,System.getenv()返回null。

79
我正在尝试使用System.getenv()方法获取我通过终端(Mac)设置的环境变量的值,我还在我的.bash_profile文件中设置了该变量,并进行了重新加载。这样做后,我echo'd该值并将正确的值打印到了终端。当尝试检索变量的值时(我确保在我的.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就可以了!


2
你是如何运行这个应用程序的?在你的 shell 中执行 printenv | grep VAR_NAME 命令是否显示了值? - Etan Reisner
是的,我正在Eclipse中运行它。@EtanReisner - SamTebbs33
1
你在Eclipse中运行你的shell命令吗? - RealSkeptic
1
你能否检查一下这两个链接是否回答了你的问题:https://dev59.com/Qm3Xa4cB1Zd3GeqPiMHt 或者 https://dev59.com/bHRB5IYBdhLWcg3wgHar?lq=1? - JFPicard
2
因此,JFPicard建议的答案应该对您有所帮助。问题在于要理解环境变量只影响设置它的进程或其子进程中的内容。而.profile仅影响终端会话。 - RealSkeptic
显示剩余3条评论
1个回答

132
这个问题的答案不仅适用于Java语言中的 System.getenv(),它是所有进程都通用的规则。每个进程都有自己独立的环境变量副本,而且只有通过父子进程关系传递,当创建子进程时,才会复制环境变量到子进程中。在这种情况下,您的shell本身就是一个进程,启动/创建了Eclipse进程。因此,Eclipse是您的shell的一个子进程,因此,在您启动Eclipse时定义的环境变量也是Eclipse实例上定义的环境变量的副本。可能是在启动Eclipse之后才在shell上定义了环境变量。因此,Eclipse及其创建的Java子进程都不会“知道”您新定义的环境变量。因此,解决方案是退出Eclipse,并从已经定义了环境变量的shell中重新启动它。另一种选择是进入项目的运行配置,并在那里定义环境变量。提示:如果您重新启动计算机,则在shell上定义的环境变量将不会保存,因为您定义的变量所在的shell进程将不复存在。如果您使用bash,则可以通过将环境变量设置命令添加到文件~/.bashrc中来模拟永久环境变量的行为。每次启动bash进程时,该文件都会被执行。还有其他方法来定义永久环境变量,请参考这里以获取更多信息。

8
实际上,在启动Eclipse之前,环境变量已经被定义了,我甚至在定义变量后重新启动了计算机,但当时它并没有按预期工作。我在我的帖子中提供的链接中得到的答案解决了这个问题。 - SamTebbs33
如果你理解了这个理论,你就会明白为什么你链接中的解决方案对你起作用了。 - SomethingSomething
2
仅供参考:如果您是Windows用户,重新启动Eclipse不会对此方法起作用,您需要明确地关闭打开IDE以使变量生效。 - diogo
在Windows中,除了答案中描述的“本地”环境变量之外,还有全局的“永久”环境变量。如果您在shell上定义了一个“本地”变量,然后不是从该特定shell打开Eclipse,那么这个变量当然不会传递给Eclipse。只有在Windows中,使用永久环境变量,才能通过单击其图标打开Eclipse,并将其与设置的环境变量一起使用(不仅适用于Eclipse,而且适用于任何启动的应用程序)。 - SomethingSomething
我该如何创建一个新变量并永久地在任何地方使用它(不仅限于同一 shell)? - Nguyễn Thắng
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接