Работает ли JavaFX после удаления его из кроссплатформенного jdk?
JavaFX 11 кросс-платформенный? Как я увидел в openjfx.org, мне нужно скачивать релизы для каждой платформы. И если да, могу ли я каким-либо образом использовать его в кроссплатформенной форме? И я должен использовать каждый выпуск javafx для каждого выпуска java? Не говорите мне использовать Maven или что-то в этом роде. Я хочу программировать кроссплатформенное программное обеспечение. И не мульти-релиз программного обеспечения каждого выпуска для каждой ОС. Я загружаю модули после проверки ОС, но могу ли я это сделать? В любом случае, существует множество кроссплатформенных библиотек, даже если они имеют нативный код, так почему же OpenJFX этого не делает?
2 ответа
JavaFX 11 больше не является частью JDK, и теперь он распространяется в двух вариантах:
- Как SDK от https://gluonhq.com/products/javafx/.
- Через Maven Central, например https://search.maven.org/artifact/org.openjfx/javafx-controls/11/jar
Когда вы загружаете JavaFX SDK, вы должны выбрать платформу, так же как и при установке JDK для вашей платформы. Он остается кроссплатформенным с точки зрения API, поэтому ваш код будет выглядеть одинаково на каждой платформе, но он зависит от платформы с точки зрения SDK/ зависимостей.
Причиной этого являются собственные библиотеки, которые поставляются в комплекте с каждым SDK.
Если вы посмотрите на три пакета JavaFX 11 SDK, то каждый из них в сжатом виде имеет около 40 МБ:
- Windows: 39,7 МБ в архиве, 64,8 МБ в библиотеках dll (
jfxwebkit.dll
только 59,2 МБ) и 15,5 МБ в банках и исходниках. - Mac: 39,7 МБ в архиве, 72,2 МБ в библиотеках dylib (
libjfxwebkit.dylib
только 67,8 МБ) и 15,6 МБ в банках и исходниках. - Linux: 43,8 МБ в архиве, 84,9 МБ в том библиотеках (
libjfxwebkit.so
только 80,1 МБ) и 15,8 МБ в банках и исходниках.
Теперь вопрос: вы бы объединили три платформы в одну? Общий архивированный размер 120 МБ, разархивированные нативные библиотеки для трех платформ около 220 МБ?
Об этой проблеме шла дискуссия именно в списке рассылки openjfx-dev, но я считаю, что принятый подход является правильным.
Если вы используете Maven/Gradle и извлекаете свои зависимости из Maven Central, в Gradle вы должны указать классификатор для вашей платформы. См. Пример "Начало работы". Maven делает это внутренне, поэтому, даже если вы не установите классификатор, он загружает только файлы jar для вашей платформы.
Поэтому для обычного проекта, в котором вы не используете WebView, это может иметь смысл, поскольку вы будете загружать только необходимые зависимости модулей для вашей платформы: javafx.base
, javafx.graphics
, javafx.controls
а также javafx.fxml
,
Но пока, и это уже нельзя изменить, вы получаете независимый от платформы JavaFX API, но с зависящими от платформы JavaFX SDK/ модулями.
Обратите внимание, что при распространении приложения JavaFX вы будете использовать Jpackager и выпустите три разные версии для трех разных платформ, так что в любом случае вам нужен дистрибутив для конкретной платформы.
JavaFX написан на Java, который запускается на JVM, которая является кроссплатформенной. Это означает, что JavaFX также является кроссплатформенным.
Вы загружаете различные выпуски для запуска JVM на своем компьютере. Но ваш код JavaFX может быть запущен на любом из этих выпусков, поэтому он кроссплатформенный.