无法通过 JAVA -8、64 位及更高版本的 NSIS 安装程序检查 Win-10 中已安装的 Java 版本
Not able to Check installed Java version in Win-10 through NSIS installer for JAVA -8 , 64-bit and above
安装程序适用于 Win-7、Win-8,但适用于 Win-10。
我的 Java 版本检查功能是 -
Function checkJavaVersion
${If} ${RunningX64}
${registry::Read} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen" "JAVA_HOME" [=12=]
MessageBox MB_OK "64 bit JAVA Home - [=12=]"
MessageBox MB_OK "64 bit JAVA Home - "
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" [=12=]
MessageBox MB_OK "64 bit JRE - [=12=]"
MessageBox MB_OK "64 bit JRE - "
${If} [=12=] == ""
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion" [=12=]
MessageBox MB_OK "64 bit JDK - [=12=]"
MessageBox MB_OK "64 bit JDK - "
${EndIf}
${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment" "CurrentVersion" [=12=]
MessageBox MB_OK "32 bit JRE - [=12=]"
MessageBox MB_OK "32 bit JRE - "
${If} [=12=] == ""
${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Development Kit" "CurrentVersion" [=12=]
MessageBox MB_OK "32 bit JDK - [=12=]"
MessageBox MB_OK "32 bit JDK - "
${EndIf}
${Else}
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" [=12=]
MessageBox MB_OK "32 bit JRE - [=12=]"
MessageBox MB_OK "32 bit JRE - "
${EndIf}
FunctionEnd
在不同系统中 运行 这个示例安装程序之后,我发现对于安装了 Java 8(64 位)的 Win-10(64 位系统)它无法识别 JAVA 版本,即使在提升模式下也不行。
也适用于安装了 JAVA 8(32 位)HKLM\SOFTWARE\JavaSoft\Java Runtime Environment
的 Win-10(64 位系统)HKLM\SOFTWARE\JavaSoft\Java Runtime Environment
此路径将注册表搜索重定向到 HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment
所以在这两种情况下(32 位和 64 位 Java 版本检查)Java 即使在提升模式下也能找到版本,这表现相同,
更详细的结果请见附件。
可以参考这个未解决的问题 NSIS installer issue 以获得更清楚的信息。
您的 64 位检测代码没有意义,NSIS 在 32 位安装程序中默认为 32 位注册表视图。 WOW6432Node
是一个 reserved name,如果可能的话你不应该真的使用它。提升安装程序不会改变注册表重定向的工作方式。
它应该看起来像这样:
${If} ${RunningX64}
SetRegView 64
${registry::Read} ... [=10=]
...
${EndIf}
SetRegView 32
${If} [=10=] == ""
${registry::Read} ... [=10=]
...
${EndIf}
根据您链接到的页面,Java v9 更改了注册表路径和名称,因此您也需要更新代码来处理这些问题。
我使用以下方法解决了这个问题:
SetRegView 64
因此用于检查的函数如下所示:
Function LocateJVM
;Check for Java version and location
Push [=11=]
Push
ReadRegStr $JAVA_VER HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion
StrCmp "" "$JAVA_VER" Check64Bit CheckJavaVer
Check64Bit:
SetRegView 64
ReadRegStr $JAVA_VER HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion
StrCmp "" "$JAVA_VER" JavaNotPresent CheckJavaVer
JavaNotPresent:
StrCpy $JAVA_INSTALLATION_MSG "Java Runtime Environment nije instalirana na Vašem računaru. Da bi ste pokrenuli ovaj program potrebno je da instalirate Java 1.7 ili noviju."
Pop
Pop [=11=]
;MessageBox MB_OK "Molim instalirajte Javu 1.7 ili noviju."
CheckJavaVer:
ReadRegStr [=11=] HKLM "SOFTWARE\JavaSoft\Java Runtime Environment$JAVA_VER" JavaHome
GetFullPathName /SHORT $JAVA_HOME "[=11=]"
StrCpy [=11=] $JAVA_VER 1 0
StrCpy $JAVA_VER 1 2
StrCpy $JAVA_VER "[=11=]"
IntCmp 17 $JAVA_VER FoundCorrectJavaVer FoundCorrectJavaVer JavaVerNotCorrect
FoundCorrectJavaVer:
IfFileExists "$JAVA_HOME\bin\javaw.exe" 0 JavaNotPresent
;MessageBox MB_OK "Found Java: $JAVA_VER at $JAVA_HOME"
Goto Done
JavaVerNotCorrect:
;MessageBox MB_OK "Molim instalirajte Javu 1.7 ili noviju."
StrCpy $JAVA_INSTALLATION_MSG "Verzija Java Runtime Environment instalirana na Vašem računaru je $JAVA_VER. Da bi ste pokrenuli ovaj program potrebno je da instalirate Java 1.7 ili noviju."
Done:
Pop
Pop [=11=]
FunctionEnd
安装程序适用于 Win-7、Win-8,但适用于 Win-10。 我的 Java 版本检查功能是 -
Function checkJavaVersion
${If} ${RunningX64}
${registry::Read} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen" "JAVA_HOME" [=12=]
MessageBox MB_OK "64 bit JAVA Home - [=12=]"
MessageBox MB_OK "64 bit JAVA Home - "
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" [=12=]
MessageBox MB_OK "64 bit JRE - [=12=]"
MessageBox MB_OK "64 bit JRE - "
${If} [=12=] == ""
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion" [=12=]
MessageBox MB_OK "64 bit JDK - [=12=]"
MessageBox MB_OK "64 bit JDK - "
${EndIf}
${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment" "CurrentVersion" [=12=]
MessageBox MB_OK "32 bit JRE - [=12=]"
MessageBox MB_OK "32 bit JRE - "
${If} [=12=] == ""
${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Development Kit" "CurrentVersion" [=12=]
MessageBox MB_OK "32 bit JDK - [=12=]"
MessageBox MB_OK "32 bit JDK - "
${EndIf}
${Else}
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" [=12=]
MessageBox MB_OK "32 bit JRE - [=12=]"
MessageBox MB_OK "32 bit JRE - "
${EndIf}
FunctionEnd
在不同系统中 运行 这个示例安装程序之后,我发现对于安装了 Java 8(64 位)的 Win-10(64 位系统)它无法识别 JAVA 版本,即使在提升模式下也不行。
也适用于安装了 JAVA 8(32 位)HKLM\SOFTWARE\JavaSoft\Java Runtime Environment
的 Win-10(64 位系统)HKLM\SOFTWARE\JavaSoft\Java Runtime Environment
此路径将注册表搜索重定向到 HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment
所以在这两种情况下(32 位和 64 位 Java 版本检查)Java 即使在提升模式下也能找到版本,这表现相同,
更详细的结果请见附件。
可以参考这个未解决的问题 NSIS installer issue 以获得更清楚的信息。
您的 64 位检测代码没有意义,NSIS 在 32 位安装程序中默认为 32 位注册表视图。 WOW6432Node
是一个 reserved name,如果可能的话你不应该真的使用它。提升安装程序不会改变注册表重定向的工作方式。
它应该看起来像这样:
${If} ${RunningX64}
SetRegView 64
${registry::Read} ... [=10=]
...
${EndIf}
SetRegView 32
${If} [=10=] == ""
${registry::Read} ... [=10=]
...
${EndIf}
根据您链接到的页面,Java v9 更改了注册表路径和名称,因此您也需要更新代码来处理这些问题。
我使用以下方法解决了这个问题:
SetRegView 64
因此用于检查的函数如下所示:
Function LocateJVM
;Check for Java version and location
Push [=11=]
Push
ReadRegStr $JAVA_VER HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion
StrCmp "" "$JAVA_VER" Check64Bit CheckJavaVer
Check64Bit:
SetRegView 64
ReadRegStr $JAVA_VER HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion
StrCmp "" "$JAVA_VER" JavaNotPresent CheckJavaVer
JavaNotPresent:
StrCpy $JAVA_INSTALLATION_MSG "Java Runtime Environment nije instalirana na Vašem računaru. Da bi ste pokrenuli ovaj program potrebno je da instalirate Java 1.7 ili noviju."
Pop
Pop [=11=]
;MessageBox MB_OK "Molim instalirajte Javu 1.7 ili noviju."
CheckJavaVer:
ReadRegStr [=11=] HKLM "SOFTWARE\JavaSoft\Java Runtime Environment$JAVA_VER" JavaHome
GetFullPathName /SHORT $JAVA_HOME "[=11=]"
StrCpy [=11=] $JAVA_VER 1 0
StrCpy $JAVA_VER 1 2
StrCpy $JAVA_VER "[=11=]"
IntCmp 17 $JAVA_VER FoundCorrectJavaVer FoundCorrectJavaVer JavaVerNotCorrect
FoundCorrectJavaVer:
IfFileExists "$JAVA_HOME\bin\javaw.exe" 0 JavaNotPresent
;MessageBox MB_OK "Found Java: $JAVA_VER at $JAVA_HOME"
Goto Done
JavaVerNotCorrect:
;MessageBox MB_OK "Molim instalirajte Javu 1.7 ili noviju."
StrCpy $JAVA_INSTALLATION_MSG "Verzija Java Runtime Environment instalirana na Vašem računaru je $JAVA_VER. Da bi ste pokrenuli ovaj program potrebno je da instalirate Java 1.7 ili noviju."
Done:
Pop
Pop [=11=]
FunctionEnd