我使用了一种方法“System.getenv();”在jar应用程序中获取用户定义的环境变量的值。我已经使jar应用程序从窗口服务运行。但是当我尝试启动服务时,它没有获得用户定义的环境变量的值并显示空指针异常。我在“System.getenv(”JAVA_HOME“)中尝试使用系统变量名;”方法,通过获取各自的值来正常工作。环境变量中用户变量的错误是什么。我应该在代码中做什么吗?
答案 0 :(得分:3)
我确认Windows服务默认运行为“本地系统帐户”,但不访问用户环境。
您可以使用该服务的用户帐户登录。
alt text http://www.adobe.com/devnet/contribute/articles/cps_autodeploy/fig06.gif
但请注意,在您的计算机重启之前,您的服务将不了解环境变量 更改 ! (请参阅此Microsoft technote或此SO question):
[
您的服务]
将从 Services.exe 进程继承其环境。
当Windows启动时,Services.exe进程会接收本地系统帐户的环境设置 由于Services.exe进程不使用Windows Messaging,因此当它在Windows启动后收到指示值已更改的消息时,Services.exe进程不会更新其环境设置。
您无法强制运行的服务确认对本地系统帐户的环境进行动态更改。
JAVA_HOME
(可能不会经常更改)可能不是问题,但可能是其他动态设置的环境变量。
如果这成为一个问题(例如,如果您无法使用给定的用户帐户启动服务),您可以在您的Java程序中嵌入 以运行命令以查询注册表并获取环境变量的当前值
String commands [] = new String [] {
"CMD.EXE",
"/C",
"RUNAS /savecred /user:"
+ username
+ " " + "regedit.exe"
};
Runtime.getRuntime().exec(commands);
with username =当前连接的用户的登录名(如果没有人连接,则需要跳过基于USER环境变量的程序的所有部分)
然后您就可以query the window registry直接阅读存储在其中的“用户变量”(它们保存在HKEY_CURRENT_USER\Environment
中)。
答案 1 :(得分:2)
Windows服务代表系统运行,而不是特定用户。我相信您可以将服务配置为作为特定用户运行,此时可能获取相关的环境变量 - 但配置应用程序会更好使用属性文件或类似的东西。
答案 2 :(得分:0)
Windows服务获取服务运行的用户的用户环境。