从控制台运行而不是作为服务运行时,Java Service Wrapper出现问题

时间:2012-05-29 22:01:59

标签: java windows registry 32bit-64bit java-service-wrapper

我有一个访问注册表项的Java Service Wrapper应用程序。 (是的,我知道,很奇怪,是吗?如果你想知道,我正在使用David的this question解决方案来使用Java从注册表中读取。)

在32位版本的Windows上,一切正常。我可以从控制台(使用Java Service Wrapper的.bat文件)和作为从bat文件安装的服务运行我的应用程序。我可以从Windows注册表中看到我需要的各种内容。

但是,在64位Windows系统上,当我将应用程序作为服务运行时,我再也看不到所需的注册表项;条目似乎都是null。但是,它仍可在控制台中使用!

我的假设是,当从控制台运行时(作为管理用户,如果它是相关的),Java Service Wrapper启动64位JVM并能够访问常规的64位注册表。然后,当作为服务运行时(通过LOCALSYSTEM用户),它启动一个32位JVM(然后尝试访问Wow6432bit节点中特殊的32位注册表。我正在寻找的条目是没有这个节点,这将解释为什么我在这种情况下得到它们的空值。

这引出了我的问题:为什么地球上的Java Service Wrapper会在通过服务列表启动时启动32位JVM,为什么从控制台启动时它会启动64位JVM?

注意:我正在使用Java Service Wrapper 3.5.14,在我的配置文件中我有

wrapper.java.additional.auto_bits=TRUE

理想情况下,我想自动保留JVM选择,因此我可以使用一个安装程序在32位和64位系统上部署我的软件。 (事实上​​,这是我选择使用JSW而不是Tomcat的一个原因。)

非常感谢阅读。

1 个答案:

答案 0 :(得分:1)

事实证明,我的安装程序(我用来安装和启动服务)是一个32位应用程序,它导致Java Service Wrapper .bat文件在安装过程中在32位环境中运行。由于64位系统上没有32位Java,这意味着包装器无法找到Java。

技巧(我从Tanuki Software支持的有用人员那里学到的)是告诉.bat文件运行64位包装器,如果已知我们在64位运行在32位环境中位系统。

基本上,在.bat文件中,找到这些行并插入指示的行。如果我遇到其他问题,我会更新我的答案。但就目前而言,这个解决方案似乎对我很有用。

rem
rem Decide on the specific Wrapper binary to use (See delta-pack)
rem
if "%PROCESSOR_ARCHITEW6432%"=="AMD64" goto amd64 (<---- insert this line)
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto amd64
if "%PROCESSOR_ARCHITECTURE%"=="IA64" goto ia64