从窗口服务运行jar应用程序时,在运行时期间没有获取用户变量的环境变量值?

时间:2009-02-11 11:24:31

标签: java runtime.exec

我使用了一种方法“System.getenv();”在jar应用程序中获取用户定义的环境变量的值。我已经使jar应用程序从窗口服务运行。但是当我尝试启动服务时,它没有获得用户定义的环境变量的值并显示空指针异常。我在“System.getenv(”JAVA_HOME“)中尝试使用系统变量名;”方法,通过获取各自的值来正常工作。环境变量中用户变量的错误是什么。我应该在代码中做什么吗?

3 个答案:

答案 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服务获取服务运行的用户的用户环境。

相关问题