Map<String, String> variables = System.getenv();  
   
 for (Map.Entry<String, String> entry : variables.entrySet())  
 {  
    String name = entry.getKey();  
    String value = entry.getValue();  
    System.out.println(name + "=" + value);  
 }  
System.out.println("System.getenv(\"APPDATA\") = " + System.getenv("APPDATA"));这段代码用来遍历所有的环境变量,直接运行可以正确得到变量值。问题是当这段代码是作为一个JBoss后台程序在运行时(通过jbosssvc.exe注册服务),APPDATA变量不能得到,总是null。

解决方案 »

  1.   


    在命令行运行SET,你可以看到APPDATA的定义
    APPDATA=C:\Documents and Settings\bruce\Application Data我的问题是如果这段Java代码是运行在jbosssvc起来的service进程中,就得不到上面的输出。我估计是jbosssvc (C++程序)的安全限定的问题,还没来得及验证这个假设。如果大家对此有经验,可以交流。
      

  2.   

    你说的有道理,APPDATA这个变量应该是用户变量,所以我无法在服务进程中获得。
      

  3.   

    我试过这个可行,我把它作为一个workaround。这个服务是在产品安装阶段调用jbosssvc注册的
    Service = CreateService(hManager,           // SCManager database
                                 _service_name,             // name of service
                                 _service_disp,             // name to display
                                 SERVICE_ALL_ACCESS,        // access required
                                 SERVICE_WIN32_OWN_PROCESS, // service type
                                 _service_auto,             // start type
                                 SERVICE_ERROR_NORMAL,      // error control type
                                 szImage,                   // service's binary
                                 NULL,                      // no load svc group
                                 NULL,                      // no tag identifier
                                 "Tcpip\0Afd\0",            // dependencies
                                 NULL,                      // use SYSTEM account
                                 NULL);                     // no password注意最后两个参数都是NULL。如果改用一个有权限的用户的帐户,应该就可以解决这个问题。但是jbosssvc是一个第三方的开源工具,我的客户也可以从jboss网站下载。总结:
    1. APPDATA是一个用户变量。
    2. 默认的Local System account不能获得APPDATA变量。
    3. 问题在于jbosssvc的服务注册方式。
    4. 可以更改服务的Log on帐号来workaround。
    5. 向jboss反馈这个问题寻求长期解决方法。