簡體   English   中英

TornadoFX 未解決的 JavaFx

[英]TornadoFX unresolved JavaFx

我想創建一個應該是桌面應用程序的新項目。 為此,我選擇了 Kotlin 語言和 TornadoFX 框架。 我已經安裝了TornadoFX插件並創建了一個新的 T tornadofx-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插件看起來也適用於 Java 1.8,但不建議使用 Java 11+ 做什么。

從 Java 11 開始,JavaFX 不再是 JDK 的一部分。

您可以在此處閱讀有關將 JavaFX 作為第三方依賴項添加到您的項目中的所有信息: https : //openjfx.io/openjfx-docs/ ,並且由於您使用的是 Gradle,因此本節將有所幫助: 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 部分。

根據插件的存儲庫,您需要做的就是編輯 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)
        }
    }
}

你應該能夠運行它:

在此處輸入圖片說明

這個答案適用於那些希望使用 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存儲庫

請注意,它也適用於 JDK 13 和 14

我在下載 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM