如何从Java程序内部访问系统变量?

时间:2012-02-12 02:07:42

标签: java system-variable

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

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

此外,当我打印JAVA_HOME(来自Eclipse)时,我也得到null。从shell中它回显/Library/Java/Home

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

任何提示?

3 个答案:

答案 0 :(得分:0)

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

export MY_HOME=/somewhere/over/the/rainbow

或者在调用程序时:

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

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

答案 1 :(得分:0)

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

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

如果执行上述操作,请尝试重新启动VM

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

答案 2 :(得分:0)

访问环境变量的方式正是您所了解的方式。该代码工作正常,您收到的结果可以准确地告诉您有关JVM的执行环境的问题。所以,

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

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

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

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

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

  6. 当你在Java中询问环境变量的值时,你无法得知你“做错了”,因为你实际做得对。

    您可以使用System.getenv()

    探索您的环境