Объединение файлов локальной библиотеки JavaFX в jar с использованием Gradle с Java 8 - PullRequest
0 голосов
/ 10 октября 2019

У меня есть приложение 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) в созданном толстом фляге?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...