【问题标题】:How to access system variable from inside Java program?如何从 Java 程序内部访问系统变量?
【发布时间】:2012-03-03 23:41:15
【问题描述】:

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

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

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

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

有什么提示吗?

【问题讨论】:

    标签: java system-variable


    【解决方案1】:

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

    export MY_HOME=/somewhere/over/the/rainbow
    

    或者在调用程序时:

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

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

    【讨论】:

    • 变量是通过export 语句设置为我的.profile 的一部分,我已经手动初始化了
    【解决方案2】:

    首先尝试访问一个不是你说的系统变量

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

    如果上述方法有效,请尝试重新启动您的虚拟机

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

    【讨论】:

    • 当您说rebooting your VM 时,您的具体意思是什么?打印 JAVA_HOME 也会打印 null
    • 重启你的机器/操作系统。您是否从控制台看到“JAVA_HOME”?
    • 嗯 ... echo $JAVA_HOME 也不打印。让我设置一下再试一次
    • 重点是尝试一些存在但不是由您创建的环境变量。 JAVA_HOME 就是一个例子。
    • 对。当我echo $JAVA_HOME 时,什么都不会打印,直到我手动设置它。
    【解决方案3】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多