0

我想获得一个操作系统(windows XP)环境变量,我的代码如下(jdk 1.6):

public class TestEnv{

public static void main(String...args){
    System.out.println(System.getenv("catalina_home"));
 }
}

catalina_home首先,我的PC中没有调用变量,它输出null,然后我在其中添加一个catalina_home变量My Computer > Advanced > Environment Variables,它仍然输出null,如果我关闭并重新启动eclipse,它会输出正确的值。如果我像这样在 cmd 控制台中运行此代码,我应该关闭并重新启动一个新的 cmd 控制台以获得正确的值,如果我删除一个现有变量,首先它输出一个非空值,直到我重新启动 eclipse 或 cmd 控制台,它可以输出null。所以我认为eclipse或cmd控制台已经缓存了OS env变量,但没有证据,即使他们真的这样做了,我想知道为什么?任何想法将不胜感激。非常感谢。

4

3 回答 3

3

当一个进程启动时,它会从它的父进程那里得到一份当前环境的副本。您必须重新启动一个进程才能获得一组新的环境。它就是这样儿的。:) 这不是 Eclipse 的问题,而是操作系统的行为方式。

于 2013-05-07T14:29:28.087 回答
2

在 Unix (Linux + Mac) 和 Windows 上,进程在启动时都会复制 env 变量。

这意味着变量映射始终是进程本地的,并且看不到其他进程所做的更改。

有两个原因:

  1. 安全。攻击者可以通过在进程启动后修改环境变量来修改正在运行的进程的行为,并导致意外/不需要的行为;想象一下,攻击者可以更改PATH现有进程的变量。这样,他们就可以将受感染的代码注入到受信任的进程中。

  2. 线程安全。如果任何人都可以随时更改局部变量,那么您需要一种同步访问和修改的方法。

于 2013-05-07T14:29:56.980 回答
0

如果您在命令解释器中使用 SET 命令设置环境变量,它会立即应用于该进程的环境。无需重新启动,无需注销和重新启动 — 无需更多。

于 2013-05-07T14:29:49.797 回答