Невозможно проверить установленную версию Java в Win-10 с помощью установщика NSIS для JAVA -8, 64-разрядной версии и выше

Установщик отлично работает для Win-7, Win-8, но странно работает для Win-10. Моя функция проверки версии Java -

Function checkJavaVersion
${If} ${RunningX64}
    ${registry::Read} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen" "JAVA_HOME" $0 $1
    MessageBox MB_OK "64 bit JAVA Home - $0"
    MessageBox MB_OK "64 bit JAVA Home - $1"

    ${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" $0 $1
    MessageBox MB_OK "64 bit JRE - $0"
    MessageBox MB_OK "64 bit JRE - $1"
    ${If} $0 == "" 
        ${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion" $0 $1
        MessageBox MB_OK "64 bit JDK - $0"
        MessageBox MB_OK "64 bit JDK - $1"
    ${EndIf}

    ${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment" "CurrentVersion" $0 $1
    MessageBox MB_OK "32 bit JRE - $0"
    MessageBox MB_OK "32 bit JRE - $1"
    ${If} $0 == "" 
        ${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Development Kit" "CurrentVersion" $0 $1
        MessageBox MB_OK "32 bit JDK - $0"
        MessageBox MB_OK "32 bit JDK - $1"
    ${EndIf}

${Else}
    ${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" $0 $1
    MessageBox MB_OK "32 bit JRE - $0"
    MessageBox MB_OK "32 bit JRE - $1"
${EndIf}
FunctionEnd

после запуска этого примера установщика в разных системах я обнаружил, что для Win-10 (64-разрядная система) с установленной Java 8 (64-разрядной) он не может распознать версию JAVA, даже в повышенном режиме.

Также для Win-10 (64-разрядная система) с установленным JAVA 8 (32-разрядная версия) HKLM\SOFTWARE\JavaSoft\Java Runtime Environment этот путь перенаправляет поиск в реестре на HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment, поэтому в обоих случаях (проверка 32-разрядной и 64-разрядной версии Java) версия Java обнаруживается даже в Повышенных режим ведет себя так же,

Пожалуйста, найдите прилагаемый результат для более подробного результата. Невозможно проверить установленную версию Java в Win-10 с помощью установщика NSIS для JAVA -8, 64-разрядной версии и выше

К этому открытому вопросу Проблема с установщиком NSIS можно обратиться для большей ясности.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
490
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш 64-битный код обнаружения не имеет смысла, NSIS по умолчанию использует 32-битный вид реестра в 32-битных установщиках. WOW6432Node - это зарезервированное имя, и вам не следует его использовать, если это возможно. Повышение уровня установщика не меняет принцип работы перенаправления реестра.

Вероятно, это должно выглядеть примерно так:

${If} ${RunningX64}
  SetRegView 64
  ${registry::Read} ... $0 $1
  ...
${EndIf}
SetRegView 32
${If} $0 == "" 
  ${registry::Read} ... $0 $1
  ...
${EndIf}

Согласно странице, на которую вы ссылаетесь, Java v9 изменила путь и имена в реестре, поэтому вам необходимо обновить свой код для их обработки.

большое спасибо, это сработало. Но я все еще хочу знать, почему $ {registry :: Read} "HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environmen" "JAVA_HOME" $ 0 $ 1, этот поиск в реестре не работает даже с указанным вами исправлением.

Ranjan Biswas 10.08.2018 07:22

«Окружающая среда», а не «Окружающая среда»

Anders 10.08.2018 13:19

Я решил эту проблему, используя:

SetRegView 64

Итак, функция, которая используется для проверки, выглядит так:

Function LocateJVM
;Check for Java version and location
Push $0
Push $1

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 $1
    Pop $0
    ;MessageBox MB_OK "Molim instalirajte Javu 1.7 ili noviju."

CheckJavaVer:
    ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$JAVA_VER" JavaHome
    GetFullPathName /SHORT $JAVA_HOME "$0"
    StrCpy $0 $JAVA_VER 1 0
    StrCpy $1 $JAVA_VER 1 2
    StrCpy $JAVA_VER "$0$1"
    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 $1
    Pop $0

FunctionEnd

Другие вопросы по теме