NSIS - 检测 x64 系统上的 java 安装时出现问题

发布于 2024-11-30 09:02:41 字数 2177 浏览 1 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

木落 2024-12-07 09:02:41

但是,一切都可以在 32 位操作系统上完美运行。但,
当我在 64 位系统上运行安装程序时,该服务将无法启动,
返回错误 1067。

退出代码 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 运行时,它可能根本无法运行。

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.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文