用于java安装的NSIS脚本

时间:2011-02-15 06:01:23

标签: java install nsis

我想使用NSIS脚本安装Java,但我必须知道系统中是否安装了Java(Windows)。根据注册码,我们如何检查是否安装了Java?

任何人都可以提供NSIS脚本来检查基于注册密钥的Java安装吗?

3 个答案:

答案 0 :(得分:3)

我没有编译它,但我会尝试跟随。我根据How can I detect the installed Sun JRE on Windows?选择了注册表项。

;--------------------------------
;Defines

  !define JavaRegKey 'HKLM "Software\JavaSoft\Java Runtime Environment" ""'

;--------------------------------
;Installer Sections
Section 'Java Runtime' SecJava

  SetOutPath '$TEMP'
  SetOverwrite on
  File 'c:\<yourdir>\javasetup.exe'
  ExecWait '$TEMP\javasetup.exe' $0
  DetailPrint '..Java Runtime Setup exit code = $0'
  Delete '$TEMP\javasetup.exe'

SectionEnd

;--------------------------------
;   Functions
Function .onInit

  ReadRegStr $R0 ${JavaRegKey}
  StrCmp $R0 "" JavaMissing JavaFound

  JavaFound: 
  !insertmacro UnselectSection ${SecJava}
  Goto JavaCheckDone

  JavaMissing:
  !insertmacro SelectSection ${SecJava}

  JavaCheckDone:

FunctionEnd

答案 1 :(得分:3)

以下代码片段检查是否安装了Java(jre或jdk)。 如果未安装Java,则会安装它。 该脚本还在变量$JavaInstallationPath中保存Java的路径。

Var JavaInstallationPath
Section "Find Java" FINDJAVA    
    DetectTry1:
    StrCpy $1 "SOFTWARE\JavaSoft\Java Runtime Environment"  
    StrCpy $2 0  
    ReadRegStr $2 HKLM "$1" "CurrentVersion"  
    StrCmp $2 "" DetectTry2 JRE 
    JRE:
    ReadRegStr $5 HKLM "$1\$2" "JavaHome"  
    StrCmp $5 "" DetectTry2 GetValue    

    DetectTry2:  
    ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"  
    StrCmp $2 "" NoJava JDK 
    JDK:
    ReadRegStr $5 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$2" "JavaHome"  
    StrCmp $5 "" NoJava GetValue

    GetValue:
    StrCpy $JavaInstallationPath $5
    Messagebox MB_OK "Javahome value: $JavaInstallationPath"
    Goto done

    NoJava:  
    Messagebox MB_OK "No Java installation detected. Installing Java."  
    # Install Java
    ExecWait "$INSTDIR\java\jre-6u26-windows-i586.exe"
    Goto DetectTry1

    done:   
    #$JavaInstallationPath should contain the system path to Java
SectionEnd  

我认为你也可以将上面的代码放在一个函数中,并在NSIS脚本中的任何地方调用它。

答案 2 :(得分:2)

使用在线jre安装程序和64/32位检查的另一个示例

java min version

!define JRE_VERSION_6 "1.5"

检查功能

Function DetectJRE
  ;64bit jre und jdk check
  SetRegView 64
  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
             "CurrentVersion"
  ;StrCmp $2 ${JRE_VERSION_6} done
  ${VersionCompare} $2 ${JRE_VERSION_6} $R0
  StrCmp $R0 "1" done

  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" \
             "CurrentVersion"
  ;StrCmp $2 ${JRE_VERSION_6} done
  ${VersionCompare} $2 ${JRE_VERSION_6} $R0
  StrCmp $R0 "1" done

  ;32bit jre und jdk check
  SetRegView 32
  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
             "CurrentVersion"
  ;StrCmp $2 ${JRE_VERSION_6} done
  ${VersionCompare} $2 ${JRE_VERSION_6} $R0
  StrCmp $R0 "1" done

  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" \
             "CurrentVersion"
  ;StrCmp $2 ${JRE_VERSION_6} done
  ${VersionCompare} $2 ${JRE_VERSION_6} $R0
  StrCmp $R0 "1" done


  Call GetJRE
  done:
FunctionEnd

版本比较

Function VersionCompare
    !define VersionCompare `!insertmacro VersionCompareCall`

    !macro VersionCompareCall _VER1 _VER2 _RESULT
        Push `${_VER1}`
        Push `${_VER2}`
        Call VersionCompare
        Pop ${_RESULT}
    !macroend

    Exch $1
    Exch
    Exch $0
    Exch
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7

    begin:
    StrCpy $2 -1
    IntOp $2 $2 + 1
    StrCpy $3 $0 1 $2
    StrCmp $3 '' +2
    StrCmp $3 '.' 0 -3
    StrCpy $4 $0 $2
    IntOp $2 $2 + 1
    StrCpy $0 $0 '' $2

    StrCpy $2 -1
    IntOp $2 $2 + 1
    StrCpy $3 $1 1 $2
    StrCmp $3 '' +2
    StrCmp $3 '.' 0 -3
    StrCpy $5 $1 $2
    IntOp $2 $2 + 1
    StrCpy $1 $1 '' $2

    StrCmp $4$5 '' equal

    StrCpy $6 -1
    IntOp $6 $6 + 1
    StrCpy $3 $4 1 $6
    StrCmp $3 '0' -2
    StrCmp $3 '' 0 +2
    StrCpy $4 0

    StrCpy $7 -1
    IntOp $7 $7 + 1
    StrCpy $3 $5 1 $7
    StrCmp $3 '0' -2
    StrCmp $3 '' 0 +2
    StrCpy $5 0

    StrCmp $4 0 0 +2
    StrCmp $5 0 begin newer2
    StrCmp $5 0 newer1
    IntCmp $6 $7 0 newer1 newer2

    StrCpy $4 '1$4'
    StrCpy $5 '1$5'
    IntCmp $4 $5 begin newer2 newer1

    equal:
    StrCpy $0 0
    goto end
    newer1:
    StrCpy $0 1
    goto end
    newer2:
    StrCpy $0 2

    end:
    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Exch $0
FunctionEnd

getJre

Function GetJRE
    MessageBox MB_YESNO "XXXXXX require at least Java 1.5! Do you want to download and install it now?" IDYES doInstall

    Abort
    doInstall:
    StrCpy $2 "$TEMP\Java Runtime Environment.exe"
    nsisdl::download /TIMEOUT=30000 ${JRE_URL} $2
    Pop $R0 ;Get the return value
        StrCmp $R0 "success" +3
        MessageBox MB_OK "Download failed: $R0"
        Quit
    ExecWait $2
    Delete $2  

    Call DetectJRE
FunctionEnd

如果缺少这些东西,你会在nsis-wiki页面找到它

相关问题