У меня есть приложение JavaFX, написанное с использованием Oracle Java 8 JDK. Этот JDK также включает библиотеку JavaFX. Чтобы сделать приложение максимально переносимым и работать с максимально возможным количеством JVM, я представил в проекте Gradle, чтобы помочь автоматизировать сборки и загружать зависимости JavaFX для JDK больше 8 (потому что они не включают JavaFX).
До сих пор, используя плагин OpenJFX Gradle вместе с плагином Shadow Gradle , я смог собрать и создать толстый флягу при сборке с использованием JDK 11, 12 и 13. Они отлично работают как отдельные файлы jar. Моя главная цель здесь состоит в том, чтобы иметь возможность упаковать зависимости JavaFX в сам jar-файл, чтобы он мог запускаться как отдельный jar-файл для максимально возможного количества JDK.
Моя основная проблема заключается в том, что плагин OpenJFX Gradle работает только с версиями Java> = 11. Поэтому я могу только условно использовать плагин OpenJFX. Это нормально, и скрипт gradle по-прежнему работает с JDK 8 (до тех пор, пока JDK включает JavaFX). Однако, что не работает, так это создание переносимого файла JAR, который включает JavaFX в качестве зависимости при запуске ./gradlew shadowBuild
с Java 8. Файл JAR создан, но он не добавляет библиотеки JavaFX, предположительно потому, что Shadow не 'Это не рассматривается как внешняя зависимость.
Конечный результат заключается в том, что когда я компилирую с использованием Java 8, а затем пытаюсь запустить файл jar с использованием Java 13, я получаю следующее исключение: Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
. И наоборот, когда я компилирую с Java 11, а затем запускаю jar с Java 11, 12 или 13, он отлично работает.
Я пытался вручную добавить JavaFX в качестве зависимости в скрипте Gradle, чтобыбезрезультатно.
Вот соответствующие части сценария сборки:
if (JavaVersion.current().isJava11Compatible() ||
JavaVersion.current().isJava12Compatible() ||
JavaVersion.current() == JavaVersion.VERSION_HIGHER) {
apply plugin: 'org.openjfx.javafxplugin'
javafx {
// javafx modules that are being used by app.
modules = ['javafx.controls', 'javafx.base', 'javafx.graphics', 'javafx.fxml', 'javafx.swing']
}
// all of these are necessary to use javax library which is no longer included in > java 8
dependencies {
compile('javax.xml.bind:jaxb-api:2.3.0')
compile('javax.activation:activation:1.1')
compile('org.glassfish.jaxb:jaxb-runtime:2.3.0')
}
}
shadowJar {
baseName = 'myJfxApp'
classifier = null
version = null
}
А вот что содержится в толстом фляге, который на самом деле содержит , содержит внешние зависимости(в отличие от скомпилированного Java 8):
- javafx
- javafx-swt.jar
- javafx.properties
- javax
- libdecora_sse.dylib
- libglass.dylib
- libjavafx_font.dylib
- libjavafx_iio.dylib
- libprism_common.dylib
- libprism_sw.dylib
- module-info.class
- org
Любые идеи о том, как включить уже существующие библиотеки JavaFXв Java 8 JDK на моем компьютере (или даже из репозитория maven) в созданном толстом фляге?