【问题标题】:TornadoFX unresolved JavaFxTornadoFX 未解决的 JavaFx
【发布时间】:2019-10-30 10:39:52
【问题描述】:

我想创建一个应该是桌面应用程序的新项目。为此,我选择了 Kotlin 语言和 TornadoFX 框架。我已经安装了TornadoFXplugin 并创建了一个新的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

是不是中间漏掉了什么变化?

【问题讨论】:

    标签: intellij-idea javafx kotlin tornadofx javafx-11


    【解决方案1】:

    看起来您正在使用 Java 11 或 12 运行 TornadoFX 项目。

    TornadoFX plugin 似乎也适用于 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 部分。

    根据插件的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)
            }
        }
    }
    

    你应该可以运行它:

    【讨论】:

    • 嘿。这有帮助。不幸的是,我遇到了另一个错误。 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你有机会知道如何解决这个问题吗?
    • 您需要使用JDK 11或12,错误提示您使用的是JDK 1.8。
    • 我已经安装了 JDK 11 并在 Intelij IDE 的构建配置中将其设置为运行时。我现在不知道该去哪里:(。屏幕截图已应用于主要问题帖子。
    • 确保您的项目设置为 JDK 11:项目结构 -> 项目(SDK 和语言级别),并且 gradle 设置 -> JVM 设置为 JDK 11。然后刷新 gradle 项目。
    • 非常感谢您的帮助
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      此答案适用于希望使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-19
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多