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

如何从Java程序内部访问系统变量?,java,system-variable,Java,System Variable,echo$MY_FILE打印“/path/to/some/FILE” System.out.println(System.getenv(“我的文件”)打印null 此外,当我打印JAVA\u HOME(来自Eclipse)时,我也会得到null。它在shell中回响/Library/Java/Home 不确定这是否相关,但我正在运行的系统是一个mac 有任何提示吗?您可能尚未导出环境变量。在大多数shell中,shell中声明的变量不会导出到子流程的环境中,除非您显式地这样做,如下所示: exp

echo$MY_FILE
打印
“/path/to/some/FILE”

System.out.println(System.getenv(“我的文件”)打印
null

此外,当我打印
JAVA\u HOME
(来自Eclipse)时,我也会得到
null
。它在shell中回响
/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"));
如果上述方法有效,请尝试重新启动VM


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

访问环境变量的方式正是您所知道的方式。这段代码运行得很好,您收到的结果准确地告诉您要询问的JVM的执行环境。所以

  • 环境变量不是“系统变量”:它们没有系统作用域;在新终端中更改它们不会在启动终端等过程中更改它们

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

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

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

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

  • 当您在Java中请求环境变量的值时,您不会发现您“做得不对”,因为您实际上做得对


    您可以使用
    System.getenv()

    来探索您的环境,当您说
    重新启动VM
    时,您的具体意思是什么?打印
    JAVA\u HOME
    打印空值,并重新启动计算机/OS。你看到控制台上的“JAVA_主页”了吗?嗯。。。echo
    $JAVA_HOME
    也不打印。让我设置它,然后再试一次,重点是尝试一些存在的环境变量,而不是由您创建的。JAVA_HOME就是一个例子。当我
    echo$JAVA_HOME
    时,在我手动设置之前,不会打印任何内容。变量是通过
    export
    语句设置的,作为我手动初始化的
    .profile
    的一部分