TornadoFX 未解决的 JavaFx
TornadoFX unresolved JavaFx
我想创建一个应该是桌面应用程序的新项目。为此,我选择了 Kotlin 语言和 TornadoFX 框架。我已经安装了 TornadoFX
插件并创建了一个新的 Ttornadofx-gradle-project
。 Intellij 进行的基本设置是成功的,但我遇到了一个问题。当我想 运行 生成的项目时,它失败了。该项目无法解析 java fx。我已经通过网络进行了挖掘,但没有发现任何可以解决问题的方法。我在构建失败后收到的错误日志是:
有没有人遇到同样的问题?我怎样才能摆脱它?
我已经安装了 JDK 11 并将其设置为构建配置,但我仍然收到问题:
java.lang.UnsupportedClassVersionError: org/openjfx/gradle/JavaFXPlugin has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
有什么变化是我中间漏掉了什么吗?
看起来您正在 运行使用 Java 11 或 12 连接 TornadoFX 项目。
看起来 TornadoFX plugin 也适用于 Java 1.8,但不建议如何处理 Java 11+。
从 Java 11 开始,JavaFX 不再是 JDK 的一部分。
您可以在此处阅读有关将 JavaFX 作为第三方依赖项添加到项目中的所有信息:https://openjfx.io/openjfx-docs/, and since you are using Gradle, this section will be helpful: https://openjfx.io/openjfx-docs/#gradle.
我刚刚安装了 Tornado 插件,并使用 JDK 12.0.1 创建了一个项目。我还更新了 gradle-wrapper.properties
文件以使用 Gradle 5.3-bin,因为默认的 4.4 不适用于 Java 11+.
如果我运行它,我得到同样的错误:
e: /.../src/main/kotlin/com/example/demo/app/Styles.kt: (3, 8): \
Unresolved reference: javafx
e: /.../src/main/kotlin/com/example/demo/app/Styles.kt: (18, 13): \
Cannot access class 'javafx.scene.text.FontWeight'. Check your module classpath for missing or conflicting dependencies
...
基本上这些错误表明 JavaFX 没有找到。 Tornado 插件没有预料到这一点。
解决方案
有一个简单的解决方案可以使此工作正常进行:将 JavaFX gradle 插件添加到构建中,以便它处理 JavaFX 部分。
根据插件的 repository,您需要做的就是编辑 build.gradle 文件并添加:
buildscript {
ext.kotlin_version = "1.2.60"
ext.tornadofx_version = "1.7.17"
ext.junit_version = "5.1.0"
repositories {
mavenLocal()
mavenCentral()
maven {
setUrl("https://plugins.gradle.org/m2/")
}
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.junit.platform:junit-platform-gradle-plugin:1.1.0"
// Add JavaFX plugin:
classpath 'org.openjfx:javafx-plugin:0.0.7'
}
}
apply plugin: "kotlin"
apply plugin: "application"
apply plugin: "org.junit.platform.gradle.plugin"
// Apply JavaFX plugin:
apply plugin: 'org.openjfx.javafxplugin'
// Add the JavaFX version and required modules:
javafx {
version = "12.0.1"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
...
就是这样,刷新你的项目,IDE 应该识别所有 JavaFX 类。
如果修改默认的MainView.kt
如:
class MainView : View("Hello TornadoFX \n with JavaFX "
+ System.getProperty("javafx.version")) {
override val root = hbox {
label(title) {
addClass(Styles.heading)
}
}
}
你应该可以 运行 它:
我在下载 Kodein-Samples 并尝试在 Java11/12 和 JavaFX13 下 运行 tornadofx 示例时收到此错误。
java.lang.UnsupportedClassVersionError: org/openjfx/gradle/JavaFXPlugin has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
解决方法很简单:我只评论了settings.gradle中的另一个模块(因为错误发生在其他模块中)。不幸的是,启动后,应用程序在尝试编辑记录时会生成错误。我还没有处理它。
所以我的 build.gradle.kts 看起来像这样:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val kodeinVersion: String by rootProject.extra
plugins {
kotlin("jvm")
application
id("org.openjfx.javafxplugin") version "0.0.8"
}
repositories {
jcenter()
maven(url = "https://dl.bintray.com/kodein-framework/Kodein-DI/")
}
application {
mainClassName = "org.kodein.samples.di.tornadofx.KodeinApplication"
}
javafx {
version = "13"
modules = mutableListOf("javafx.controls", "javafx.fxml", "javafx.base", "javafx.media")
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation("no.tornado:tornadofx:1.7.19")
implementation("org.kodein.di:kodein-di-generic-jvm:$kodeinVersion")
implementation("org.kodein.di:kodein-di-conf:$kodeinVersion")
implementation("org.kodein.di:kodein-di-framework-tornadofx-jvm:$kodeinVersion")
}
我为这个例子创建了分支,并做了一些改动:https://github.com/ibelozor/Kodein-Samples
此答案适用于希望使用 Gradle Kotlin DSL 的人。
一个最小的例子 build.gradle.kts
:
plugins {
kotlin("jvm") version "1.4.0-rc"
application
id("org.openjfx.javafxplugin") version "0.0.9"
}
application { mainClassName = "com.example.MyApp" }
repositories {
mavenCentral()
jcenter()
maven("https://dl.bintray.com/kotlin/kotlin-eap")
}
dependencies {
// Kotlin standard library
implementation(kotlin("stdlib-jdk8"))
// TornadoFX dependency
implementation("no.tornado:tornadofx:1.7.20")
}
// JavaJX module to include
javafx { modules = listOf("javafx.controls", "javafx.fxml", "javafx.graphics") }
// Set Kotlin/JVM target versions
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "11" // or higher
kotlinOptions.languageVersion = "1.4"
}
// Be sure to use lates Gradle version
tasks.named<Wrapper>("wrapper") { gradleVersion = "6.6" }
有关完整的工作示例,请查看 GitHub repository
请注意,它也适用于 JDK 13 和 14
我想创建一个应该是桌面应用程序的新项目。为此,我选择了 Kotlin 语言和 TornadoFX 框架。我已经安装了 TornadoFX
插件并创建了一个新的 Ttornadofx-gradle-project
。 Intellij 进行的基本设置是成功的,但我遇到了一个问题。当我想 运行 生成的项目时,它失败了。该项目无法解析 java fx。我已经通过网络进行了挖掘,但没有发现任何可以解决问题的方法。我在构建失败后收到的错误日志是:
有没有人遇到同样的问题?我怎样才能摆脱它?
我已经安装了 JDK 11 并将其设置为构建配置,但我仍然收到问题:
java.lang.UnsupportedClassVersionError: org/openjfx/gradle/JavaFXPlugin has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
有什么变化是我中间漏掉了什么吗?
看起来您正在 运行使用 Java 11 或 12 连接 TornadoFX 项目。
看起来 TornadoFX plugin 也适用于 Java 1.8,但不建议如何处理 Java 11+。
从 Java 11 开始,JavaFX 不再是 JDK 的一部分。
您可以在此处阅读有关将 JavaFX 作为第三方依赖项添加到项目中的所有信息:https://openjfx.io/openjfx-docs/, and since you are using Gradle, this section will be helpful: https://openjfx.io/openjfx-docs/#gradle.
我刚刚安装了 Tornado 插件,并使用 JDK 12.0.1 创建了一个项目。我还更新了 gradle-wrapper.properties
文件以使用 Gradle 5.3-bin,因为默认的 4.4 不适用于 Java 11+.
如果我运行它,我得到同样的错误:
e: /.../src/main/kotlin/com/example/demo/app/Styles.kt: (3, 8): \
Unresolved reference: javafx
e: /.../src/main/kotlin/com/example/demo/app/Styles.kt: (18, 13): \
Cannot access class 'javafx.scene.text.FontWeight'. Check your module classpath for missing or conflicting dependencies
...
基本上这些错误表明 JavaFX 没有找到。 Tornado 插件没有预料到这一点。
解决方案
有一个简单的解决方案可以使此工作正常进行:将 JavaFX gradle 插件添加到构建中,以便它处理 JavaFX 部分。
根据插件的 repository,您需要做的就是编辑 build.gradle 文件并添加:
buildscript {
ext.kotlin_version = "1.2.60"
ext.tornadofx_version = "1.7.17"
ext.junit_version = "5.1.0"
repositories {
mavenLocal()
mavenCentral()
maven {
setUrl("https://plugins.gradle.org/m2/")
}
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.junit.platform:junit-platform-gradle-plugin:1.1.0"
// Add JavaFX plugin:
classpath 'org.openjfx:javafx-plugin:0.0.7'
}
}
apply plugin: "kotlin"
apply plugin: "application"
apply plugin: "org.junit.platform.gradle.plugin"
// Apply JavaFX plugin:
apply plugin: 'org.openjfx.javafxplugin'
// Add the JavaFX version and required modules:
javafx {
version = "12.0.1"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
...
就是这样,刷新你的项目,IDE 应该识别所有 JavaFX 类。
如果修改默认的MainView.kt
如:
class MainView : View("Hello TornadoFX \n with JavaFX "
+ System.getProperty("javafx.version")) {
override val root = hbox {
label(title) {
addClass(Styles.heading)
}
}
}
你应该可以 运行 它:
我在下载 Kodein-Samples 并尝试在 Java11/12 和 JavaFX13 下 运行 tornadofx 示例时收到此错误。
java.lang.UnsupportedClassVersionError: org/openjfx/gradle/JavaFXPlugin has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
解决方法很简单:我只评论了settings.gradle中的另一个模块(因为错误发生在其他模块中)。不幸的是,启动后,应用程序在尝试编辑记录时会生成错误。我还没有处理它。 所以我的 build.gradle.kts 看起来像这样:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val kodeinVersion: String by rootProject.extra
plugins {
kotlin("jvm")
application
id("org.openjfx.javafxplugin") version "0.0.8"
}
repositories {
jcenter()
maven(url = "https://dl.bintray.com/kodein-framework/Kodein-DI/")
}
application {
mainClassName = "org.kodein.samples.di.tornadofx.KodeinApplication"
}
javafx {
version = "13"
modules = mutableListOf("javafx.controls", "javafx.fxml", "javafx.base", "javafx.media")
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation("no.tornado:tornadofx:1.7.19")
implementation("org.kodein.di:kodein-di-generic-jvm:$kodeinVersion")
implementation("org.kodein.di:kodein-di-conf:$kodeinVersion")
implementation("org.kodein.di:kodein-di-framework-tornadofx-jvm:$kodeinVersion")
}
我为这个例子创建了分支,并做了一些改动:https://github.com/ibelozor/Kodein-Samples
此答案适用于希望使用 Gradle Kotlin DSL 的人。
一个最小的例子 build.gradle.kts
:
plugins {
kotlin("jvm") version "1.4.0-rc"
application
id("org.openjfx.javafxplugin") version "0.0.9"
}
application { mainClassName = "com.example.MyApp" }
repositories {
mavenCentral()
jcenter()
maven("https://dl.bintray.com/kotlin/kotlin-eap")
}
dependencies {
// Kotlin standard library
implementation(kotlin("stdlib-jdk8"))
// TornadoFX dependency
implementation("no.tornado:tornadofx:1.7.20")
}
// JavaJX module to include
javafx { modules = listOf("javafx.controls", "javafx.fxml", "javafx.graphics") }
// Set Kotlin/JVM target versions
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "11" // or higher
kotlinOptions.languageVersion = "1.4"
}
// Be sure to use lates Gradle version
tasks.named<Wrapper>("wrapper") { gradleVersion = "6.6" }
有关完整的工作示例,请查看 GitHub repository
请注意,它也适用于 JDK 13 和 14