java System.getenv Umgebungsnamen beginnend mit "="

8

Ich habe bemerkt, dass die Umgebung in Java unter Windows (wie durch einen Aufruf von System.getenv () erhalten) einige Variablen enthält, die in der realen Umgebung nicht existieren. Diese beginnen mit Gleichheitszeichen und enthalten "= ExitCode", das dem Beendigungscode des Prozesses zugeordnet wird, der kurz vor dieser Java-Invokation ausgeführt wurde. und die Standardverzeichnisse verschiedener Laufwerksbuchstaben wie "= C:", "= D:". Dies scheint bei allen Java-Versionen von Sun der Fall zu sein, die auf allen Windows-Versionen laufen. Ist dies irgendwo dokumentiert, oder ist es ausschließlich für Sun's interne?

Bearbeiten Hier ist eine einfache Beispielanwendung, um zu zeigen, was ich meine. Kompilieren und führen Sie dies in der Befehlszeile aus:

%Vor%

Vergleichen Sie dann die Variablen mit dem Befehl SET (aus cmd.exe) oder mit einem ähnlichen in C geschriebenen Befehlszeilenprogramm. Sie finden die Variablen, die mit = beginnen, nicht in diesen:

%Vor%

Diese Variablen werden offensichtlich während der Ausführung der JVM hinzugefügt.

    
Klitos Kyriacou 07.05.2015, 13:36
quelle

2 Antworten

2

Systemvariablen, die mit Gleichheitszeichen beginnen, sind real. Was Sie beobachten, ist nicht Java Hinzufügen mehr Umgebungsvariablen; Es ist SET command versteckt einige der Variablen.

Windows verbietet die Verwendung von Gleichheitszeichen in den Namen von Umgebungsvariablen, die Benutzer festlegen können. Dadurch werden Variablen mit = für die interne Verwendung reserviert. Diese Variablen können über Windows-APIs abgerufen werden , z. %Code%. Die Java-Bibliothek filtert diese Liste nicht, sodass die speziellen Variablen für Ihren Code verfügbar werden. Der GetEnvironmentStringsW -Befehl von Windows hingegen filtert sie heraus und erzeugt eine Diskrepanz.

Laut dieser Antwort sind diese "magischen" Variablen aus Gründen der Abwärtskompatibilität mit der ms-dos-Verzeichnisbehandlung vorhanden Sie können sie ignorieren.

    
dasblinkenlight 07.05.2015, 14:20
quelle
1

Java's System.getenv () zeigt Umgebungsvariablen was Java sieht. Wenn es sich von der "echten" Umgebung unterscheidet, gibt es einen Unterschied, wie Sie Ihre Java und "echte" Umgebung ausführen.

Zuallererst, was ist "echt" für dich? Ist es ein cmd-Fenster? Dann startet cmd einige Schritte (zum Beispiel sehr veraltet, aber immer noch aktiv autoexec.bat) und dann haben Sie Ihre Variablen. Wenn "real" für Sie bedeutet, müssen Sie noch erkennen, dass es einen Fluss gibt, wie dieser bestimmte Prozess startet und wie er seine Variablen erhält. Zumindest können Sie Systemvariablen und Benutzervariablen sehen und verstehen, dass dies kein trivialer Prozess ist. Persönlich bevorzuge ich den Befehl cmd, weil ich hier den Befehl SET verwende und reale Variablen für den aktuellen Prozess im aktuellen Moment sehe. Der aktuelle Moment ist ein weiterer Faktor, da sich Variablen auf der Grundlage einiger Aktionen zeitlich ändern können, und sie hängen davon ab, wann der Prozess gestartet wurde, und sie bleiben in diesem Prozess erhalten, bis er stirbt.

Absicht dieser kleinen Vorlesung ist es, zu zeigen, dass der Java-Prozess kompliziert ist und von vielen Faktoren abhängt und sich daher von dem unterscheidet, was für Sie "echt" ist. Basierend auf den Werten, die Sie zur Verfügung gestellt haben, könnte es sich um einige Artefakte handeln, die Sie bei der Ausführung von Java erhalten haben. Zum Beispiel führen Sie Ihre Anwendung in Eclipse und es hat seine eigenen Umgebungseinstellungen und jeder Prozess hat auch seine eigenen Einstellungen. Einige Variablen können für andere Variablen verwendet werden, die in Java verwendet werden. _JAVA_OPTIONS wäre ein gutes Beispiel.

Unterm Strich - wenn Sie unterschiedliche Umgebungen haben - finden Sie sie, aber beschuldigen Sie Java nicht, diese bereitzustellen. Sie verwalten Ihre Umgebungen, nicht Java.

    
Alex 07.05.2015 14:09
quelle

Tags und Links