Java System.getenv以"="开头的环境变量名称

8
我注意到在Windows上的Java环境(通过System.getenv()调用获取)包括一些在实际环境中不存在的变量。这些变量以等号和“=ExitCode”开头,其中“=ExitCode”对应于刚刚运行的进程的退出代码;各个驱动器字母的默认目录,如“=C:”、“=D:”。似乎所有版本的Sun Java都是如此,在所有Windows版本上运行。这是否有任何文档记录,或者仅供Sun内部使用?
编辑: 这里有一个简单的示例应用程序,展示了我的意思。在命令行上编译并运行它:
import java.util.Map;
class ShowEnv {
    public static void main(String[] args) {
        for (Map.Entry v : System.getenv().entrySet())
            System.out.printf("%-23s= %.54s%n", v.getKey(), v.getValue());
    }
}

然后使用SET命令(来自cmd.exe)或类似的用C编写的命令行程序,比较变量。你会发现以=开头的变量在这些命令中不存在:

=ExitCode              = 00000000
=::                    = ::\
=C:                    = C:\Temp

显然,这些变量是在JVM执行期间添加的。


https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getenv() - Garry
虽然我不确定文档说明,但这些变量只是在执行Java命令时设置的临时变量。您可能没有使用它们的限制,但我建议不要使用它们,因为它们不能保证可用,只是临时的。 - Wayne
请分享你所参考的代码和输出。我是一名Java工程师,我可以帮助你理解它们的行为。 - Mohan Raj
@MohanRaj 请查看已编辑的问题。 - Klitos Kyriacou
2个回答

2
以等号开头的系统变量是真实存在的。你所观察到的不是Java“添加”更多环境变量,而是SET命令“隐藏”了一些变量。
Windows禁止在用户可以设置的环境变量名称中使用等号,因此保留带有=的变量供内部使用。这些变量可以通过Windows API检索,例如GetEnvironmentStringsW。Java库不会过滤此列表,因此特殊变量可供您的代码使用。另一方面,Windows的SET命令会将它们过滤掉,从而创建一个差异。
根据这个答案,这些“神奇”的变量是为了向后兼容ms-dos目录处理而存在的,因此您可以安全地忽略它们。

1
其他开发人员也遇到了这个问题。这里有一个在Apache的Ant Bug存储库中相关的问题:https://bz.apache.org/bugzilla/show_bug.cgi?id=49366。 - Sergey Kalinichenko
感谢@dasblinkenlight,这正是正确的答案!SET命令和C语言中的getenv()函数都误导了我。(顺便说一句,我试图给自己的问题投反对票,因为我得出了错误的结论,但它不允许我这样做。) - Klitos Kyriacou

1

Java的System.getenv()显示Java所看到的环境变量。如果它与“实际”环境不同,则说明您运行Java和“实际”环境之间存在差异。

首先,对于您来说,“真实”的环境是什么?是cmd窗口吗?然后启动cmd需要一些步骤(例如非常过时但仍然活跃的autoexec.bat),然后您就有了变量。如果“真实”对您来说是Start->计算机->属性->高级系统设置->环境变量,那么您仍然必须意识到这个特定过程如何启动以及如何获得它的变量。至少您可以查看系统变量和用户变量,并理解这不是一个简单的过程。个人而言,我更喜欢cmd方式,因为在这里我可以使用SET命令并查看当前进程的真实变量。当前时刻是另一个因素,因为变量可以随时间改变基于某些操作,因此它们取决于进程启动的时间,并在该进程中保留直到其终止。

这个小讲座的目的是展示Java进程很复杂,取决于许多因素,因此与您的“真实”情况可能不同。根据您提供的值,我猜测它们可能是您运行Java时留下的一些遗物。例如,您在Eclipse中运行应用程序,并且它有自己的环境设置,而每个进程也都有自己的设置。有些变量可能来自于Java中使用的其他变量。_JAVA_OPTIONS 是一个很好的例子。
总之,如果您的环境不同,请找出它们,但不要责怪Java提供它们。您正在管理您的环境,而不是Java。

这几乎是诗意的... 但它并没有直接回答OP的问题。 - CaffeineToCode
当然可以。但是如何找到 OP 在环境设置中的 "=D:" 位置呢?设定方向,人们就会自己帮助解决问题。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接