NSIS - 检测 x64 系统上的 java 安装时出现问题
我有一个 NSIS 安装程序,有时必须检查系统中是否安装了 java,如果没有,则必须静默安装。它还必须返回java的路径,因为我必须创建JAVA_HOME环境变量。
这是我编写的用于检查 java 安装并将 java 路径保存在变量中的函数:
Var JavaInstallationPath
Function FindJava
StrCpy $1 "SOFTWARE\JavaSoft\Java Runtime Environment"
StrCpy $2 0
ReadRegStr $2 HKLM "$1" "CurrentVersion"
${If} $2 == ""
Goto DetectTry2
${Else}
ReadRegStr $5 HKLM "$1\$2" "JavaHome"
${If} $5 == ""
Goto DetectTry2
${Else}
StrCpy $JavaInstallationPath $5
Messagebox MB_OK "Javahome value: $JavaInstallationPath"
${EndIf}
${EndIf}
DetectTry2:
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"
${If} $2 == ""
Goto NoJava
${Else}
ReadRegStr $5 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$2" "JavaHome"
${If} $5 == ""
Goto NoJava
${Else}
StrCpy $JavaInstallationPath $5
Messagebox MB_OK "Javahome value: $JavaInstallationPath"
${EndIf}
${EndIf}
NoJava:
Messagebox MB_OK "No Java installation detected. Installing Java."
# Install Java
Messagebox MB_OK "Running x32"
ExecWait "$INSTDIR\temp\jre-6u26-windows-i586.exe"
# get jre path value after installation
StrCpy $1 "SOFTWARE\JavaSoft\Java Runtime Environment"
StrCpy $2 0
ReadRegStr $2 HKLM "$1" "CurrentVersion"
ReadRegStr $5 HKLM "$1\$2" "JavaHome"
StrCpy $JavaInstallationPath $5
Messagebox MB_OK "Java installation path: $JavaInstallationPath"
FunctionEnd
稍后在安装程序中我安装了一个运行 ruby 脚本的服务:(
nsExec::ExecToLog 'jruby "$INSTDIR\Application\install\install_service.rb"'
.rb
文件内有什么不会产生问题,因为我尝试将 java 的路径硬编码,并且一切正常)
但是,一切都在 32 位操作系统上完美运行。但是,当我在 64 位系统上运行安装程序时,该服务将无法启动,并返回错误 1067。
起初我以为 FindJava
函数无法正常工作它会导致服务安装错误,但我在消息框中发送了所有结果,它们与预期完全一致。
不幸的是,问题确实出在该函数中。我删除了该功能,我对 $JavaInstallationPath 进行了硬编码,并且安装程序正常工作。
我真的不知道出了什么问题。 请帮忙。
I have a NSIS installer that at a point has to check if java is installed in the system, and, if not, it has to install it silently. It also have to return the path to java, because I have to create JAVA_HOME environment variable.
This is the function that I have wrote to check java installation and save the path to java in a variable:
Var JavaInstallationPath
Function FindJava
StrCpy $1 "SOFTWARE\JavaSoft\Java Runtime Environment"
StrCpy $2 0
ReadRegStr $2 HKLM "$1" "CurrentVersion"
${If} $2 == ""
Goto DetectTry2
${Else}
ReadRegStr $5 HKLM "$1\$2" "JavaHome"
${If} $5 == ""
Goto DetectTry2
${Else}
StrCpy $JavaInstallationPath $5
Messagebox MB_OK "Javahome value: $JavaInstallationPath"
${EndIf}
${EndIf}
DetectTry2:
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"
${If} $2 == ""
Goto NoJava
${Else}
ReadRegStr $5 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$2" "JavaHome"
${If} $5 == ""
Goto NoJava
${Else}
StrCpy $JavaInstallationPath $5
Messagebox MB_OK "Javahome value: $JavaInstallationPath"
${EndIf}
${EndIf}
NoJava:
Messagebox MB_OK "No Java installation detected. Installing Java."
# Install Java
Messagebox MB_OK "Running x32"
ExecWait "$INSTDIR\temp\jre-6u26-windows-i586.exe"
# get jre path value after installation
StrCpy $1 "SOFTWARE\JavaSoft\Java Runtime Environment"
StrCpy $2 0
ReadRegStr $2 HKLM "$1" "CurrentVersion"
ReadRegStr $5 HKLM "$1\$2" "JavaHome"
StrCpy $JavaInstallationPath $5
Messagebox MB_OK "Java installation path: $JavaInstallationPath"
FunctionEnd
Later in the installer I install a service running a ruby script:
nsExec::ExecToLog 'jruby "$INSTDIR\Application\install\install_service.rb"'
(what is inside that .rb
file does not create problems, because I have tried to hardcode the path to java, and everything worked ok)
However, everything works perfectly on 32-bit operating systems. But, when I run the installer on 64-bit systems, that service won't start, returning error 1067.
At first I thought that FindJava
function doesn't work correctly and it causes a faulty installation of the service, but I sent all the results in messageboxes and they are exactly as expected.
Unfortunately, the problem is really in that function. I removed the function, I have hardcoded $JavaInstallationPath, and the installer worked.
I really don't know what is wrong.
Please, help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
退出代码 1067 指的是“进程意外终止”。请参阅 http://www.chicagotech.net/troubleshooting/exitcode2.htm
我尝试检查在 Windows 64 位上运行 JRuby 是否存在任何问题,确实存在!检查此链接:
http://hype -free.blogspot.com/2011/09/running-jruby-on-64-bit-windows.html
但是,我确实认为如果 JRuby .jar 依赖于当前安装的 Java使其运行,但没有安装 Java 运行时,它可能根本无法运行。
Windows exit code 1067 refers to "The process terminated unexpectedly." See http://www.chicagotech.net/troubleshooting/exitcode2.htm
I try to check whether there is any issue running JRuby on Windows 64-bit and there is! Check this link:
http://hype-free.blogspot.com/2011/09/running-jruby-on-64-bit-windows.html
But, I do think that if JRuby .jar depends on currently installed Java runtime to make it run but there is no Java runtime installed, it may not run at all.