JavaFX и OpenJDK
Я пытаюсь решить, могу ли я переключиться на JavaFX для пользовательского интерфейса моего приложения Java. Большинство моих пользователей будут использовать Oracle JRE, в который в настоящее время интегрирован JavaFX. Однако некоторые используют OpenJDK (в Linux). Этот (старый) вопрос предполагает, что OpenJDK очень плохо работает с JavaFX. Согласно этому вопросу, альтернативный OpenJFX будет полностью интегрирован в OpenJDK только в версии 9. Так что мой вопрос двоякий:
- Поддержка JavaFX в OpenJDK все еще так плоха?
- Если да, есть ли какие-либо дистрибутивы Linux, которые уже предлагают пакет OpenJFX, чтобы пользователям не пришлось создавать его самостоятельно?
8 ответов
JavaFX является частью OpenJDK
Сам проект JavaFX имеет открытый исходный код и является частью проекта OpenJDK.
Сборка JavaFX из репозитория OpenJDK
Вы можете создать открытую версию OpenJDK (включая JavaFX) полностью из исходного кода, который не зависит от Oracle JDK или закрытого исходного кода.
Обновление: использование дистрибутива JavaFX, предварительно созданного из исходных кодов OpenJDK
Как отмечено в комментариях к этому вопросу и в другом ответе, дистрибутивы Debian Linux предлагают двоичное распределение JavaFX на основе OpenJDK:
- https://packages.qa.debian.org/o/openjfx.html
Установить через:
sudo apt-get install openjfx
Различия между Open JDK и Oracle JDK относительно JavaFX
Следующая информация была предоставлена для Java 8. Начиная с Java 9, кодировка VP6 устарела для JavaFX, а технология развертывания встроенных приложений Oracle WebStart / Browser также устарела. Поэтому будущие версии JavaFX, даже если они распространяются Oracle, скорее всего, не будут включать в себя какие-либо технологии, не имеющие открытого исходного кода.
Oracle JDK включает в себя некоторое программное обеспечение, которое нельзя использовать из OpenJDK. Есть два основных компонента, которые относятся к JavaFX.
- Видеокодек ON2 VP6, который принадлежит Google и Google, еще не открыт.
- Технология развертывания приложений Oracle WebStart/Browser Embedded.
Это означает, что открытая версия JavaFX не может воспроизводить файлы VP6 FLV. Это не большая потеря, так как трудно найти кодеры VP6 или носители, закодированные в VP6.
Другие более распространенные форматы видео, такие как H.264, будут хорошо воспроизводиться с открытой версией JavaFX (при условии, что на целевом компьютере предварительно установлены соответствующие кодеки).
Отсутствие технологии развертывания WebStart / Browser Embedded на самом деле связано с самим OpenJDK, а не с JavaFX. Эта технология может быть использована для развертывания приложений не-JavaFX.
Было бы замечательно, если бы сообщество OpenSource разработало технологию развертывания для Java (и другого программного обеспечения), которая полностью заменила методы развертывания WebStart и Browser Embedded, предоставляя приятный и легкий пользовательский интерфейс для распространения приложений. Я считаю, что некоторые проекты начали служить такой цели, но они еще не достигли высокого уровня зрелости и уровня принятия.
Лично я считаю, что WebStart / Browser Embedded являются устаревшей технологией, и в настоящее время существуют более эффективные способы развертывания многих приложений JavaFX (таких как автономные приложения).
Кому нужно создавать дистрибутивы Linux OpenJDK, включающие JavaFX
Люди, которые создают пакеты для дистрибутивов Linux на основе OpenJDK (например, Redhat, Ubuntu и т. Д.), Должны создавать RPM для JDK и JRE, которые включают JavaFX. Затем эти распространители программного обеспечения должны поместить сгенерированные пакеты в свои стандартные репозитории кода распространения (например, репозитории fedora / red hat network yum). В настоящее время этого не делается, но я был бы весьма удивлен, если бы пакеты Java 8 Linux не включали JavaFX, когда Java 8 была выпущена в марте 2014 года.
Рекомендации по развертыванию для основных приложений
Я советую использовать автономный режим развертывания приложений Java.
Описание этого режима развертывания:
Приложение устанавливается на локальный диск и запускается как отдельная программа с использованием частной копии сред выполнения Java и JavaFX. Приложение может быть запущено так же, как другие собственные приложения для этой операционной системы, например, с помощью ярлыка на рабочем столе или пункта меню.
Вы можете создать автономное приложение либо из дистрибутива Oracle JDK, либо из сборки OpenJDK, включающей JavaFX. В настоящее время это проще сделать с помощью Oracle JDK.
Поскольку версия Java связана с вашим приложением, вам не нужно заботиться о том, какая версия Java могла быть предварительно установлена на компьютере, какие возможности она имеет и совместима ли она с вашей программой. Вместо этого вы можете протестировать ваше приложение на соответствие точной версии среды выполнения Java и распространить ее вместе с вашим приложением. Пользовательское развертывание вашего приложения будет таким же, как и установка собственного приложения на их компьютер (например, установка Windows.exe или.msi, OS X .dmg, linux .rpm или.deb).
Обновление, апрель 2018 года: информация о текущей политике Oracle в отношении будущих разработок
- Будущее JavaFX и других обновлений дорожной карты клиента Java от Дональда Смита, старшего директора по управлению продуктами, Oracle.
- Обновление дорожной карты клиента Java - март 2018 года.
В качестве быстрого решения вы можете скопировать JAR-файл среды выполнения JavaFX и файлы, на которые ссылается Oracle JRE(JDK) или любое автономное приложение, использующее JavaFX(например, JavaFX Scene Builder 2.0):
cp <JRE_WITH_JAVAFX_HOME>/lib/ext/jfxrt.jar <JRE_HOME>/lib/ext/
cp <JRE_WITH_JAVAFX_HOME>/lib/javafx.properties <JRE_HOME>/lib/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libprism_* <JRE_HOME>/lib/amd64/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libglass.so <JRE_HOME>/lib/amd64/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libjavafx_* <JRE_HOME>/lib/amd64/
просто убедитесь, что у вас есть GTK 2.18 или выше
Также отвечая на этот вопрос:
Где взять готовые библиотеки JavaFX для OpenJDK (Windows)
В Linux это не проблема, но в Windows это не так просто, особенно если вы хотите распространять JRE.
На самом деле вы можете использовать OpenJFX с OpenJDK 8 для Windows, вам просто нужно собрать его самостоятельно:
Загрузите OpenJDK здесь: https://github.com/AdoptOpenJDK/openjdk8-releases/releases/tag/jdk8u172-b11
Загрузите OpenJFX отсюда: https://github.com/SkyLandTW/OpenJFX-binary-windows/releases/tag/v8u172-b11
скопируйте все файлы из почтового индекса OpenFX поверх JDK, вуаля, у вас есть OpenJDK с JavaFX.
Попробуй obuildfactory.
Необходимо изменить эти сценарии (содержит ошибку и точно не выполняет требуемую "вещь"), я буду загружать свои сценарии, разветвленные из obuildfactory, в ближайшие несколько дней. и поэтому я также обновлю свой ответ соответственно.
До тех пор, наслаждайтесь, сэр:)
Мне нужно было запустить .jar в Windows, для чего требовался Java FX. Мне также не нужна часть JDK.
Примечание: я не стал менять
PATH
/
JAVA_HOME
переменные, потому что в моем случае это не было необходимо, для более полного пошагового руководства см. Как установить OpenJDK 11 в Windows?
- Загрузите OpenJDK и Java FX (jmods) (версия 17.0.2 для этого примера)
https://gluonhq.com/products/javafx/
Разархивируйте загруженные файлы. Скопируйте/переместите файлы .jmod из каталога Java FX в каталог OpenJDK (подкаталог jmods).
Создайте JRE с jlink, используйте это веб-приложение, чтобы получить точные параметры командной строки:https://justinmahar.github.io/easyjre/
Фрагмент PowerShell:
$Version = '17.0.2'
$DownDir = 'path\to\dir\with\.zip'
$JdkDir = "jdk-${Version}"
$JavaFxDir = "javafx-jmods-${Version}"
$NewDir = "jre-${Version}+javafx"
$ProgramFilesDir = "$env:ProgramFiles\OpenJDK\${NewDir}"
Set-Location -Path $DownDir
# Unzip archives
Expand-Archive -Path "openjfx-${Version}_windows-x64_bin-jmods.zip" -Destination .
Expand-Archive -Path "openjdk-${Version}_windows-x64_bin.zip" -Destination .
# Create a custom runtime image using jlink, excluding all modules that start with 'jdk.'
Copy-Item -Path "${JavaFxDir}\*.jmod" -Destination "${JdkDir}\jmods"
$Mods = Get-Item -Path "$JdkDir\jmods\*.jmod" | ? { !($_.Name -like 'jdk.*') }
$Mods = $Mods.Name -replace '.jmod$' -join ','
& "${JdkDir}\bin\jlink.exe" --output $NewDir --compress=2 --no-header-files --no-man-pages --module-path "${JdkDir}\jmods" --add-modules $Mods
# (Optional) Delete unzipped directories
Remove-Item -Path $JdkDir,$JavaFxDir -Recurse
# Test if the .jar works
$jar = Get-Item "\path\to\.jar"
& "${NewDir}\bin\javaw.exe" -jar $jar
# (Optional) Copy the new directory to Program Files (requires admin privileges), zip it to distribute to other computers and delete it
Copy-Item -Path $NewDir -Destination $ProgramFilesDir -Recurse
Compress-Archive -Path $NewDir -DestinationPath "openjdk-${Version}_jre+javafx_windows-x64_bin.zip"
Remove-Item -Path $NewDir -Recurse
# (Optional) Create shortcut in Desktop
$Lnk = "$env:USERPROFILE\Desktop\Shortcut.lnk"
$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($Lnk)
$Shortcut.TargetPath = "${ProgramFilesDir}\bin\javaw.exe"
$Shortcut.WorkingDirectory = $jar.DirectoryName
$Shortcut.Arguments = '-jar "' + $jar.FullName + '"'
$Shortcut.Save()
В соответствии с Oracle интеграция OpenJDK & javaFX будет в первом квартале 2014 года (см. Дорожную карту: http://www.oracle.com/technetwork/java/javafx/overview/roadmap-1446331.html). Итак, на первый вопрос ответ таков, что вам нужно подождать до тех пор. Для 2-го вопроса другого пути нет. Итак, пока идите с java swing или запустите javaFX и подождите
Я использовал Amazon Coretto JDK. В нем были все необходимые мне FX-компоненты.