Gradle, как добавить вариант VM для запуска и развертывания jfoenix на javafx 11 идея? - PullRequest
0 голосов
/ 28 сентября 2019

Я использую javafx 11.0.2 и java 11.0.3. Чтобы обнаружить 'gradle', я скачал этот проект https://github.com/fthdgn/java11-javafx-demo, и когда я добавляю элементы управления jfoenix в main.fxml, как это

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.*?>
<?import com.jfoenix.controls.JFXTextField?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTabPane?>
<?import javafx.scene.control.Tab?>
<AnchorPane xmlns="http://javafx.com/javafx/8.0.121"
            xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.fthdgn.app.controller.MainController">
    <VBox alignment="CENTER" spacing="10.0" AnchorPane.bottomAnchor="10"
          AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10" fx:id="vbox">
        <TextField fx:id="inputTextField"/>
        <Button mnemonicParsing="false" onAction="#reveseButtonClicked" text="Reverse"/>
        <TextField fx:id="outputTextField"/>
        <JFXTextField fx:id="tf"/>
        <JFXButton text="AZUL" fx:id="button"/>
        <JFXTabPane>
            <Tab>
            </Tab>
        </JFXTabPane>

    </VBox>
</AnchorPane>

Я получил эту знаменитую ошибку

Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin (in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior (in module javafx.controls) because module javafx.controls does not export com.sun.javafx.scene.control.behavior to module com.jfoenix

Я отредактировал build.gradle, чтобы добавить некоторые параметры jvm (для приложения модуля), как это

plugins {
    id 'java'
    id 'application'
    id 'com.zyxist.chainsaw' version '0.3.1'
    id 'org.beryx.jlink' version '2.15.1'
}
compileJava.options.encoding = 'UTF-8'

import org.gradle.internal.jvm.Jvm
import org.gradle.internal.os.OperatingSystem

group 'com.fthdgn'
version '1.0-SNAPSHOT'

sourceCompatibility = 11
targetCompatibility = 11

repositories {
    mavenCentral()
}

mainClassName = mainClass

def currentOS = OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
    platform = 'win'
} else if (currentOS.isLinux()) {
    platform = 'linux'
} else if (currentOS.isMacOsX()) {
    platform = 'mac'
}

jlink {
    javaHome.set(Jvm.current().getJavaHome().getAbsolutePath())

}

dependencies {
    implementation "org.openjfx:javafx-base:11:${platform}"
    implementation "org.openjfx:javafx-graphics:11:${platform}"
    implementation "org.openjfx:javafx-controls:11:${platform}"
    implementation "org.openjfx:javafx-fxml:11:${platform}"
    compile group: 'com.jfoenix', name: 'jfoenix', version: '9.0.9'


}

run {
    jvmArgs += ['--add-exports', 'javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.controls/com.sun.javafx.scene.control=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.base/com.sun.javafx.binding=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.graphics/com.sun.javafx.stage=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.base/com.sun.javafx.event=com.jfoenix']

}


Я только что добавил

run {
    jvmArgs += ['--add-exports', 'javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.controls/com.sun.javafx.scene.control=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.base/com.sun.javafx.binding=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.graphics/com.sun.javafx.stage=com.jfoenix']
    jvmArgs += ['--add-exports', 'javafx.base/com.sun.javafx.event=com.jfoenix']

}


И запустить как обаяние, но это все, что нужно для развертывания, как мне установить этот jvmArgs для всех задач, чтобы использовать jfoenix в gradle с javafx 11 и java 11?

module com.fthdgn.app {
    requires javafx.controls;
    requires javafx.fxml;
    requires transitive com.jfoenix;
    opens com.fthdgn.app to javafx.graphics;
    opens com.fthdgn.app.controller to javafx.fxml;
}

1 Ответ

1 голос
/ 28 сентября 2019

Вы можете следовать документации для JavaFX 11+, раздел Modular with Gradle.

Существует образец , который использует плагин Gradle JavaFX, чтобыиметь дело с зависимостями JavaFX и задачами сборки и запуска, а также плагином Jlink для развертывания пользовательской среды выполнения образов.

Все, что вам нужно сделать, это добавить зависимость Jfoenix вэтот проект, измените его исходный код соответствующим образом и, наконец, включите необходимые jvmArgs в задачи run и jlink, например:

plugins {
  id 'application'
  id 'org.openjfx.javafxplugin' version '0.0.8'
  id 'org.beryx.jlink' version '2.15.1'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation group: 'com.jfoenix', name: 'jfoenix', version: '9.0.9'
}

javafx {
    version = "13"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

run {
    jvmArgs = [
            "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix",
            "--add-exports=javafx.controls/com.sun.javafx.scene.control=com.jfoenix",
            "--add-exports=javafx.base/com.sun.javafx.binding=com.jfoenix",
            "--add-exports=javafx.graphics/com.sun.javafx.stage=com.jfoenix",
            "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix",
    ]
}

jlink {
    launcher {
        name = 'hellofx'
        jvmArgs = [
                "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix",
                "--add-exports=javafx.controls/com.sun.javafx.scene.control=com.jfoenix",
                "--add-exports=javafx.base/com.sun.javafx.binding=com.jfoenix",
                "--add-exports=javafx.graphics/com.sun.javafx.stage=com.jfoenix",
                "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix",
        ]
    }
}

mainClassName = "$moduleName/org.openjfx.MainApp"

Теперь вы можете запустить свой проект с помощью:

./gradlew run

и создайте образ времени выполнения с помощью:

./gradlew jlink

Как только он закончит сборку, вы можете запустить его из скрипта:

build/image/bin/hellofx
...