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