简体   繁体   中英

java System.getenv environment names starting with “=”

I've noticed that the environment in Java on Windows (as obtained by a System.getenv() call) includes some variables that don't exist in the real environment. These begin with and equals-sign and include "=ExitCode" which maps to the exit code of the process that ran just before this java invokation; and the default directories of various drive letters, such as "=C:", "=D:". This seems to be the case with all of Sun's Java versions, running on all Windows versions. Is this documented anywhere, or is it purely for Sun's internal only?

Edit Here's a simple example application to show what I mean. Compile and run this on the command line:

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());
    }
}

Then compare the variables with the SET command (from cmd.exe) or with similar command-line program written in C. You'll find the variables beginning with = don't exist in those:

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

These variables are obviously added during execution of the JVM.

System variables that start in equal sign are real. What you observe is not Java adding more environment variables; it is SET command hiding some of the variables.

Windows prohibits the use of equal sign in names of environment variables that users can set, thus reserving variables with = in them for internal use. These variables can be retrieved through windows APIs , eg GetEnvironmentStringsW . Java library does not filter this list, so the special variables become available to your code. SET command of Windows, on the other hand, filters them out, creating a discrepancy.

According to this answer , these "magic" variables are there for backward compatibility with ms-dos directory handling, so you can safely ignore them.

Java's System.getenv() shows environment variables what Java sees. If it is different from "real" environment then there difference how you run your Java and "real" environment.

First of all what is "real" for you? Is it cmd window? Then starting cmd takes some steps (for example very obsolete but still active autoexec.bat) and then you have your variables. If "real" means for you Start->Computer->Properties->Advanced System Settings->Environment Variables then you still have to realize that there is some flow how this particular process starts and how it gets it's variables. At least you can see System Variables and User variables and understand that this is not trivial process. Personally, I prefer cmd way because here I cat use command SET and see real variables for current process at current moment. Current moment is another factor because variables can change in time based on some actions as well as they depend on when process started and they are preserved in this process till it dies.

Intent of this small lecture is to show that Java process is complicated and depends on many factors and so it will be different from whatever is "real" for you. Based on values what you provided I guess they could be some left artifacts from process how you run Java. For example your run your application in Eclipse and it has its own environmental settings plus each process has its own settings too. Some variables may come for other variables which are used in Java. _JAVA_OPTIONS would be good example.

Bottom line - if you have difference in environments - find them but don't blame Java in providing them. You are managing your environments, not Java.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM