【问题标题】:why System.getenv("CATALINA_HOME") returns null?为什么 System.getenv("CATALINA_HOME") 返回 null?
【发布时间】:2013-05-07 07:31:18
【问题描述】:

我定义了一个系统变量CATALINA_HOME,它指的是我的操作系统(windows 7 Ultimate 64位)中的tomcat安装目录,现在我想通过java获取它,我的代码如下:

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

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

那为什么我不能得到它,或者有没有其他方法可以得到系统环境变量?

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"));

输出:

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

如我们所见,最后一行是空值,即 CATALINA_HOME 变量的值。

PS:我的tomcat不是安装版。

【问题讨论】:

  • 能否返回其他环境变量?还是只是 CATALINA_HOME 不起作用?你从哪里运行你的代码(eclipse)?
  • @PhilippSander,System.getenv() 返回的varialbes 比我在操作系统环境变量列表中看到的要多(在系统属性对话框中),除 CATALINA_HOME 之外的所有变量都可以通过getenv() 检索,并且CATALINA_HOME 是唯一一个不工作的。
  • 设置为系统变量还是用户变量?
  • 您是在命令行窗口中通过My Computer &gt; Advanced &gt; Environment Variables 还是仅通过set CATALINA_HOME 设置的?因为第二个是该窗口的本地。
  • @Theodoros,我用第一种方式设置CATALINA_HOME变量。

标签: java environment-variables


【解决方案1】:

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

【讨论】:

  • IntelliJ Ultimate 2017.3.3 也发生了同样的事情。我不得不关闭所有 IntelliJ 窗口并重新打开我的应用程序,然后我才在 String catalinaHome = System.getEnv("CATALINA_HOME"); 中获得了一个值
  • 它也发生在我身上。 IDE 在打开时使用 env 变量,之后您在终端中执行的任何操作都不会影响 IDE。必须重新启动它才能让它反映在 IDE 中。和我一起,我不得不重新启动笔记本电脑才能正常工作
【解决方案2】:

可能的原因:

  1. 您在命令提示符中使用了set CATALINA_HOME。这使得这个变量在这个窗口中是本地的。它应该对从此命令提示符启动的进程可见,但在其他任何地方都看不到。使用My Computer &gt; Advanced &gt; Environment Variables 使变量对所有新进程可见。

  2. 试图读取变量的进程已经在运行。重新启动它。

    注意:如果从调试器启动 Tomcat 或从命令行启动独立 Tomcat 进程,这可能是 IDE。

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

  4. Tomcat 在其 Java 代码中取消设置变量。

【讨论】:

  • 原因 1:我在 My Compuer&gt;Advanced&gt;Envronments VAriables 中设置了 CATALINA_HOME,而不是命令行方式。原因2和原因3:我现在不启动tomcat,只是在我的单元测试类中获取CATAALINA_HOME变量。
  • 我的单元测试类喜欢这样:public class TestEnv { @Test public void test() { System.out.println(System.getenv("CATALINA_HOME")); } } 首先单击上下文菜单中的Run as &gt; junit test。我现在回家了,我只是在我的 PC(windows xp)上测试,这段代码对我来说很好,如果我删除 CATALINA_HOME 变量,它也会输出非空值,如果我添加一个新的 env 变量,即CATALINA_BASE,它返回null,所以看起来是缓存问题,我可以重新启动我的电脑吗?
  • 我找到了解决方案:关闭 Eclipse 并启动(不是 File 菜单中的 Restart),代码将按预期工作。这对我来说很奇怪,似乎eclipse将系统环境变量缓存为打开。你有同样的问题吗?
  • 是的,请参阅我的回答中的原因 #2:设置变量不会更改它们已经运行的进程。
  • @bugCracker:正确。使用菜单项重新启动 Eclipse 不起作用,因为 Eclipse 有一个隐藏的启动 Java 的父进程。由于Java进程继承了隐藏父进程的变量,所以只有在隐藏父进程重启时才会看到新的env变量。
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2015-11-25
  • 2015-07-04
相关资源
最近更新 更多