为什么System.getenv("CATALINA_HOME")返回null?

hiw*_*way 5 java environment-variables

我定义了一个系统变量CATALINA_HOME,它引用了我的OS系统中的tomcat安装目录(windows 7 ultimate 64 bit),现在我想通过java获取它,我的代码如下:

System.out.println(System.getenv("CATALINA_HOME"));
Run Code Online (Sandbox Code Playgroud)

它返回null,我很确定这个变量存在于我的系统中,我输入set catalina_homecmd控制台,它显示了分配给它的值.

那么为什么我不能得到它,或者有其他方法来获得系统env变量?

PS:以下是检索到的所有变量System.getenv().

    Map<String, String> env = System.getenv();
    for (String key : env.keySet())
    {
        System.out.println(key + ":" + env.get(key));
    }

    System.out.println(System.getenv("CATALINA_HOME"));
Run Code Online (Sandbox Code Playgroud)

输出:

USERPROFILE:C:\Users\chorusheng
ProgramData:C:\ProgramData
PATHEXT:.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
JAVA_HOME:C:\Program Files\Java\jdk1.6.0_20
ProgramFiles(x86):C:\Program Files (x86)
TEMP:C:\Users\CHORUS~1\AppData\Local\Temp
SystemDrive:C:
ProgramFiles:C:\Program Files
Path:C:/Program Files (x86)/Java/jre7/bin/client;C:/Program Files (x86)/Java/jre7/bin;C:/Program Files (x86)/Java/jre7/lib/i386;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;d:\Program Files (x86)\KOUTON\CTBS Standard Client;C:\Program Files (x86)\PC Connectivity Solution\;D:\oracle\product\11.2.0\dbhome_1\bin;C:\Program Files (x86)\Common Files\NetSarang;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\EgisTec BioExcess\;C:\Program Files (x86)\EgisTec BioExcess\x64;C:\Program Files (x86)\Common Files\Thunder Network\KanKan\Codecs;d:\Program Files (x86)\Tencent\QQPCMgr\6.6.2150.401;D:\Program Files (x86)\TortoiseSVN\bin;d:\Program Files (x86)\DigiWin OpenVPN\bin;d:\Program Files (x86)\Tencent\QQPCMgr\6.6.2150.401;F:\chega\eclipsej2ee3.7;
HOMEDRIVE:C:
DYNA_HOME:E:\plm
PROCESSOR_REVISION:2502
USERDOMAIN:chorus
ALLUSERSPROFILE:C:\ProgramData
ProgramW6432:C:\Program Files
PROCESSOR_IDENTIFIER:Intel64 Family 6 Model 37 Stepping 2, GenuineIntel
SESSIONNAME:Console
TMP:C:\Users\CHORUS~1\AppData\Local\Temp
CommonProgramFiles:C:\Program Files\Common Files
CLASSPATH:.;C:\Program Files\Java\jdk1.6.0_20\lib\dt.jar;C:\Program Files\Java\jdk1.6.0_20\lib\tools.jar;
LOGONSERVER:\\CHORUS
PROCESSOR_ARCHITECTURE:AMD64
FP_NO_HOST_CHECK:NO
OS:Windows_NT
HOMEPATH:\Users\chorusheng
PROCESSOR_LEVEL:6
CommonProgramW6432:C:\Program Files\Common Files
1830B7BD-F7A3-4c4d-989B-C004DE465EDE:f44:431b280
LOCALAPPDATA:C:\Users\chorusheng\AppData\Local
COMPUTERNAME:CHORUS
windir:C:\Windows
SystemRoot:C:\Windows
asl.log:Destination=file
NUMBER_OF_PROCESSORS:4
USERNAME:chorusheng
PUBLIC:C:\Users\Public
PSModulePath:C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
CommonProgramFiles(x86):C:\Program Files (x86)\Common Files
ComSpec:C:\Windows\system32\cmd.exe
APPDATA:C:\Users\chorusheng\AppData\Roaming
null
Run Code Online (Sandbox Code Playgroud)

我们可以看到,最后一行是null,它是CATALINA_HOME变量的值.

PS:我的tomcat不是安装版.

Aar*_*lla 11

可能的原因:

  1. 您已set CATALINA_HOME在命令提示符中使用.这使得此变量在此窗口中是局部的.对于从此命令提示符启动的进程,它应该是可见的,但不是其他地方.使用My Computer > Advanced > Environment Variables使变量可见于所有新进程.

  2. 尝试读取变量的进程已在运行.重启它.

  3. Tomcat的启动脚本在调用之前取消设置变量 java.exe

  4. Tomcat在其Java代码中取消了变量.

  • 我找到了一个解决方案:关闭eclipse并启动(在`File`菜单中不是`Restart`),代码将按预期工作.这对我来说很奇怪,似乎eclipse将系统env变量缓存为开放.你有同样的问题吗? (6认同)
  • 是的,请参阅我的答案中的原因#2:设置变量不会为已经运行的进程更改它们. (4认同)
  • @bugCracker:正确。使用菜单项重新启动 Eclipse 不起作用,因为 Eclipse 有一个隐藏的父进程来启动 Java。由于 Java 进程继承了隐藏父进程的变量,所以它只会在隐藏父进程重新启动时看到新的 env 变量。 (2认同)

小智 6

如果方法system.getenv("some name")返回,null您可能在使用 Eclipse IDE 后在环境中定义了此变量。只需重新启动 Eclipse,然后再次运行项目即可。

  • 我的 IntelliJ Ultimate 2017.3.3 也发生了同样的事情。我必须关闭所有 IntelliJ 窗口并重新打开我的应用程序,然后我才在 `String catalinaHome = System.getEnv("CATALINA_HOME");` 中得到一个值 (2认同)