0

echo $MY_FILE印刷"/path/to/some/file"

System.out.println(System.getenv("MY_FILE"));印刷null

此外,当我打印JAVA_HOME(从 Eclipse)时,我也得到了null. 从外壳回响/Library/Java/Home

不确定这是否相关,但我正在运行的系统是mac

有什么提示吗?

4

3 回答 3

0

您可能尚未导出环境变量。在大多数 shell 中,shell 中声明的变量不会导出到子进程的环境中,除非你明确地这样做,或者像这样:

export MY_HOME=/somewhere/over/the/rainbow

或者在调用程序时:

MY_HOME=/somewhere/over/the/rainbow java com.example.MyApplication

另请记住,环境不是全局的,因此您对环境所做的更改只会影响该流程及其子流程。如果要影响系统上所有进程的环境,则必须对其进行特殊配置。在大多数情况下,在 shell 中导出是您想要的。

于 2012-02-12T02:13:33.540 回答
0

首先尝试访问不是由您创建的系统变量

System.out.println(System.getenv("JAVA_HOME"));

如果上述工作,请尝试重新启动您的虚拟机

环境变量似乎在某种缓存中,重新启动是刷新它的一种方法。

于 2012-02-12T02:18:49.853 回答
0

访问环境变量的方式正是您所知道的方式。该代码运行良好,并且您收到的结果准确地告诉您有关您所询问问题的 JVM 的执行环境。所以,

  1. 环境变量不是“系统变量”:它们没有系统范围;在新终端中更改它们不会在启动终端等的过程中更改它们。

  2. 它们由操作系统进程持有,并被复制到该进程的子进程中。因此,孩子在更改自己的环境变量时也不会更改父母的环境变量。

  3. 如果您启动 Eclipse,然后在 .profile 或其他任何内容中设置环境变量,然后从 Eclipse 启动的 JVM 不反映这些设置,那么您知道 Eclipse 在启动 JVM 之前不会启动读取您的 .profile 的 shell;它可以调用 shell 以使其不读取 .profile,它可以完全调用另一个 shell,它可以直接启动 JVM,而不涉及 shell。

  4. 如果您在设置这些变量后启动 Eclipse,并看到相同的行为,那么您已经了解了启动 Eclipse 的相同过程。

  5. 如果您在设置这些变量后重新启动,并看到相同的行为,那么您已经了解了有关窗口环境的相同信息。

当您在 Java 中询问环境变量的值时,您不会知道自己“做错了”,因为您实际上做对了。

您可以通过以下方式探索您的环境System.getenv()

于 2012-02-12T03:14:44.367 回答