我想获得一个OS(Windows XP)env变量,我的代码在下面(jdk 1.6):
public class TestEnv{
public static void main(String...args){
System.out.println(System.getenv("catalina_home"));
}
}
在frist,我的PC中没有名为catalina_home
的变量,它输出null
,然后我在catalina_home
中添加My Computer > Advanced > Environment Variables
变量,它仍然输出{{ 1}},如果我关闭并重新启动eclipse,它会输出正确的值。如果我在这样的cmd控制台中运行此代码,我会关闭并重新启动一个新的cmd控制台以获取正确的值,如果我删除一个现有变量,首先它输出一个非空值,直到我重新启动eclipse或cmd控制台,它可以输出null
。所以我认为eclipse或cmd控制台已经缓存了OS env变量,但是没有证据,即使它们确实存在,我想知道为什么?
任何想法将不胜感激。非常感谢。
答案 0 :(得分:3)
当一个进程启动时,它将从它的父进程获得当前环境的副本。您必须重新启动进程才能获得一组新环境。它就是这样儿的。 :)这不是eclipse的问题,它是操作系统的行为方式。
答案 1 :(得分:2)
在Unix(Linux + Mac)和Windows上,进程在启动时都会复制env变量。
这意味着变量映射始终是进程本地的,并且不会看到其他进程所做的更改。
有两个原因:
安全。攻击者可以通过在进程启动后修改env变量来修改正在运行的进程的行为,并导致意外/不需要的行为;想象一下,攻击者可以更改现有进程的PATH
变量。这样,他们就可以将受到破坏的代码注入可信进程。
线程安全。如果任何人都可以随时更改局部变量,则需要一种方法来同步访问和修改。
答案 2 :(得分:0)
如果在命令解释程序中使用SET命令设置环境变量,它将在那里应用,然后应用于该进程的环境。没有重启,没有注销和开启 - 没有必要。