我正在使用 javafx 11.0.2 和 java 11.0.3 为了发现“gradle”,我下载了这个项目https://github.com/fthdgn/java11-javafx-demo当我像这样在 main.fxml 中添加 jfoenix 控件时
<?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 以在 gradle 中使用 javafx 11 和 java 11 的 jfoenix ?
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;
}
最佳答案
您可以关注documentation对于 JavaFX 11+,请参阅使用 Gradle 进行模块化部分。
有一个sample它利用 JavaFX gradle 插件来处理 JavaFX 依赖项以及构建和运行任务,以及 Jlink插件,用于处理自定义图像运行时的部署。
您所要做的就是将 Jfoenix 依赖项添加到该项目中,相应地修改其源代码,最后在 run
和 中包含所需的
任务,如下所示:jvmArgs
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
关于java - Gradle如何添加VM选项以在javafx 11 idea上运行和部署jfoenix?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58141582/