#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.