echo $MY_FILE
印刷"/path/to/some/file"
System.out.println(System.getenv("MY_FILE"));
印刷null
此外,当我打印JAVA_HOME
(从 Eclipse)时,我也得到了null
. 从外壳回响/Library/Java/Home
不确定这是否相关,但我正在运行的系统是mac
有什么提示吗?
echo $MY_FILE
印刷"/path/to/some/file"
System.out.println(System.getenv("MY_FILE"));
印刷null
此外,当我打印JAVA_HOME
(从 Eclipse)时,我也得到了null
. 从外壳回响/Library/Java/Home
不确定这是否相关,但我正在运行的系统是mac
有什么提示吗?
您可能尚未导出环境变量。在大多数 shell 中,shell 中声明的变量不会导出到子进程的环境中,除非你明确地这样做,或者像这样:
export MY_HOME=/somewhere/over/the/rainbow
或者在调用程序时:
MY_HOME=/somewhere/over/the/rainbow java com.example.MyApplication
另请记住,环境不是全局的,因此您对环境所做的更改只会影响该流程及其子流程。如果要影响系统上所有进程的环境,则必须对其进行特殊配置。在大多数情况下,在 shell 中导出是您想要的。
首先尝试访问不是由您创建的系统变量
System.out.println(System.getenv("JAVA_HOME"));
如果上述工作,请尝试重新启动您的虚拟机
环境变量似乎在某种缓存中,重新启动是刷新它的一种方法。
访问环境变量的方式正是您所知道的方式。该代码运行良好,并且您收到的结果准确地告诉您有关您所询问问题的 JVM 的执行环境。所以,
环境变量不是“系统变量”:它们没有系统范围;在新终端中更改它们不会在启动终端等的过程中更改它们。
它们由操作系统进程持有,并被复制到该进程的子进程中。因此,孩子在更改自己的环境变量时也不会更改父母的环境变量。
如果您启动 Eclipse,然后在 .profile 或其他任何内容中设置环境变量,然后从 Eclipse 启动的 JVM 不反映这些设置,那么您知道 Eclipse 在启动 JVM 之前不会启动读取您的 .profile 的 shell;它可以调用 shell 以使其不读取 .profile,它可以完全调用另一个 shell,它可以直接启动 JVM,而不涉及 shell。
如果您在设置这些变量后启动 Eclipse,并看到相同的行为,那么您已经了解了启动 Eclipse 的相同过程。
如果您在设置这些变量后重新启动,并看到相同的行为,那么您已经了解了有关窗口环境的相同信息。
当您在 Java 中询问环境变量的值时,您不会知道自己“做错了”,因为您实际上做对了。
您可以通过以下方式探索您的环境System.getenv()