Приложение JavaFX не запускается, когда установлен JAVA_HOME

#javafx #javafx-8 #exe #executable

#javafx #javafx-8 #exe #исполняемый файл

Вопрос:

Я упаковываю свое приложение JavaFX с помощью java 1.8u45 и Inno5 в виде EXE-файла с помощью ant. И исполняемый файл работает при его установке на компьютер, где либо установлена Java 8 и установлена в качестве переменной среды JAVA_HOME, либо когда java вообще не установлена. Но если, например, установлена java 1.6 или меньше, а для переменной JAVA_HOME установлено значение java 1.6, приложение не запустится с очень общей ошибкой Failed to start jvm . Запуск связанного файла .jar через java -jar foobar.jar либо вызывает сбой и полностью останавливает jvm, либо печатает unsupported major.minor version 52.0 .

Как я могу сказать JavaFX никогда не использовать JAVA_HOME?

Приложение упаковывается как exe-файл с помощью fxbuilder, используя:

     <fx:deploy verbose="true" embedJNLP="false" extension="false" includeDT="false" offlineAllowed="true" outdir="${basedir}/target/deploy" outfile="application" nativeBundles="exe" updatemode="background">
        <!-- To list all classes loaded -->
        <!--<fx:jvmarg value="-verbose:class"/>

        <fx:platform basedir="${java.home}" />-->
        <fx:info title="App" vendor="Me" />

        <fx:application refId="fxApplication" />
        <fx:resources refid="appRes" />
    </fx:deploy>
 

Комментарии:

1. Пожалуйста, уточните, как вы упаковываете приложение? Вы использовали fxpackager с такими параметрами?

2. @SergeyGrinev да, я использую fxpackager и обновил вопрос с более подробной информацией

Ответ №1:

При подключении к JRE встроенная программа запуска ищет соответствующий .cfg файл с именем файла, который содержит информацию о местоположении JRE (должна быть какая-то строка, подобная этой: app.runtime=$APPDIRruntime )

Если этот .cfg файл содержит только app.runtime= (без значения), встроенная программа запуска выполняет поиск локальных установленных JRE: https://github.com/teamfx/openjfx-8u-dev-rt/blob/master/modules/fxpackager/src/main/native/library/common/Package.cpp#L120

В Windows встроенная программа запуска проверяет системный реестр и НЕ проверяет JAVA_HOME-свойство! https://github.com/teamfx/openjfx-8u-dev-rt/blob/master/modules/fxpackager/src/main/native/library/common/WindowsPlatform.cpp#L188

То же самое относится и к другим платформам, но они проверяют JRE_HOME, но никогда JAVA_HOME.

Я бы посоветовал вам проверить windows-реестр (был ли установлен JDK 6 ПОСЛЕ JDK 8, который заменил более высокую версию?)!

Отказ от ответственности:Я являюсь разработчиком javafx-maven-plugin и создателем javafx-gradle-plugin.

Комментарии:

1. JDK или JRE 6 были установлены после JRE 8. Есть ли какой-либо способ заставить exe использовать установленный JRE app.runtime ? Почему JavaFX даже ищет java в реестре и JRE_HOME, когда он упакован как часть исполняемого файла?

2. Я дважды проверил источники, System-JRE используется только тогда, когда app.runtime -field не имеет значения. Убедитесь сами: github.com/teamfx/openjfx-8u-dev-rt/blob/master/modules /…

3. @Huber Я только что увидел, что вы пытаетесь запустить свое приложение через java -executable, а не через собственный лаунчер! Вы пытались использовать полный путь к java.exe ? Что-то вроде c:Program FilesJavajre1.8.0_92binjava.exe -jar foobar.jar … первая java, найденная на ПУТИ, будет принята, если не был указан полный путь

4. Но запуск приложения с foobar.exe вызывает его выброс Failed to start JVM error . Я не знаю, что вызывает это сообщение об ошибке, как app.runtime установлено. Что-то в JavaFX, похоже, ссылается на что-то, что является частью системы, например, на запись реестра или переменную среды.

5. Просто убедитесь, что вы правильно подключили приложение, возможно, ваше приложение каким-то образом сбой. Сначала проверьте via java -jar (с абсолютным путем), затем проверьте выполнение exe-файла, а затем проверьте его локальную установку (все в системе разработчика). Как я проверил и сказал, он использует этот SystemJRE только тогда, когда не установлен его связанный JRE.