1

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

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

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

我的假设是,当从控制台运行时(作为管理用户,如果相关的话)Java Service Wrapper 会启动一个 64 位 JVM 并能够访问常规的 64 位注册表。然后,当作为服务运行(通过 LOCALSYSTEM 用户)时,它会启动一个 32 位 JVM(然后它会尝试访问 Wow6432bit 节点中的 oh-so-special 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 的原因之一。)

非常感谢您的阅读。

4

1 回答 1

1

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

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

Basically, in the .bat file, find these lines and insert the indicated line. If I encounter further problems, I'll update my answer. But for now, this solution seems to work well for me quite nicely.

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
于 2012-06-01T18:41:25.293 回答