java - 从控制台运行与作为服务运行时 Java 服务包装器出现问题

标签 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 系统上,当我将应用程序作为服务运行时,我无法再看到所需的注册表项;这些条目似乎全部为空。但是,它在控制台中仍然有效!

我的假设是,当从控制台运行时(作为管理用户,如果相关的话),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 的原因之一。)

非常感谢您的阅读。

最佳答案

事实证明,我的安装程序(我用来安装和启动服务的)是一个 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

关于java - 从控制台运行与作为服务运行时 Java 服务包装器出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10807325/

相关文章:

java - python中java的 'constructor-overload'相当于什么?

java - OSGI 是否解决了 Java 中缺少 AppDomain 的问题?

python - 编译Cython代码时出现"error: Unable to find vcvarsall.bat"

c# - 注册表 - NetworkList 配置文件 - 无法通过程序访问

Windows:更改与文件类型关联的应用程序的名称/图标

java - 如何从 Java 程序中获取文本输入并创建外部文本文档?

windows - Windows 任务栏图标中有多少像素?

windows - 如何在 Windows XP 上显示 Windows 照片打印向导?

powershell - 在Powershell中搜索注册表以查找特定的键和这些键中的值

java - 更改 ListView 的搜索输入中的默认键盘语言