当前位置: 首页 > 知识库问答 >
问题:

打包tornadofx应用程序时,major.minor版本错误

暨弘懿
2023-03-14

几个月来,我一直在开发龙卷风FX应用程序。它在IDE中运行良好(intellij ultimate,win 10),但是现在我需要创建一个实际的可执行罐子供其他人运行它,我似乎无法让它工作。

我正在使用openfx分级插件来自动收集javafx依赖项并提供应用程序/运行任务,这是我在开发过程中一直在使用的。那里的文档还包含组织.beryx.jlink作为此最终打包过程的插件。这是一个龙卷风FX应用程序,我已经用Kotlin写了整个事情。我现在遇到的问题是,当我运行 jlink、jlinkZip 或 jpackage 任务(我假设它们会为我提供可分发的内部版本)时,我会收到错误“不支持的主要.minor 版本 56.0”。

我做了一些调查,心想,“也许我需要把我的jdk从12升级到14”,所以我安装了openjdk14,现在错误是“不支持的主要.次要版本58.0。”所以,很明显,问题是我的jdk太新了...?我不确定。然而,我不知道我需要什么版本的jdk来构建它。我只是不知道该何去何从。我做的一些其他研究表明,jlink不能与kotlin一起工作,但“org . beryx . jlink”gradle插件是“Badass jlink ”,可以与Kotlin一起工作。

为了进一步了解背景,我有多个子模块和一个单独构建的内部核心库,因此有很多部分需要构建和组合在一起。但是,每个子模块 build.gradle 看起来都像这样:

apply from: "$rootDir/kotlin-module.gradle"
apply from: "$rootDir/local-repositories.gradle" // helps resolve the local version of the core module.

dependencies {
    implementation "<--anonymized core module-->"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3"
    testImplementation 'io.cucumber:cucumber-java8:5.5.0'
    testImplementation 'io.cucumber:cucumber-junit:5.5.0'

    implementation project(":application")
    implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.61"
}

configurations {
    cucumberRuntime {
        extendsFrom testImplementation
    }
}

task cucumber() {
    dependsOn assemble, compileTestJava
    doLast {
        javaexec {
            main = "io.cucumber.core.cli.Main"
            classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
            args = ['--plugin', 'pretty', '--add-plugin', 'html:build/cucumber/html-report', '--glue', '<-- root package name -->', 'src/test/resources/features', '--strict']
        }
    }
}

而kotlin模块。gradle文件如下所示:

apply plugin: 'kotlin'

group '<-- anonymized group name -->'
version '0.1.0'

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.6.0'
    testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "13" // version issue here?
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "13" // version issue here?
}

test {
    useJUnitPlatform()
}

包含javafx和龙卷风fx的实际子模块如下所示:

plugins {
    id 'java'
    id 'application'
    id 'org.jetbrains.kotlin.jvm'
    id 'org.openjfx.javafxplugin' version '0.0.8'
    id 'org.beryx.jlink' version '2.12.0'
    id 'edu.sc.seis.launch4j' version '2.4.6'
    id 'no.tornado.fxlauncher' version '1.0.20'
}

apply from: "$rootDir/kotlin-module.gradle"
apply from: "$rootDir/local-repositories.gradle"

repositories {
    jcenter()
}

dependencies {
    implementation "<--anonymized core module-->"

    implementation project(":application")
    implementation project(":data")
    implementation project(":gui")
    implementation "no.tornado:tornadofx:1.7.19"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-javafx:1.3.3"
    testImplementation 'io.cucumber:cucumber-java8:5.5.0'
    testImplementation 'io.cucumber:cucumber-junit:5.5.0'

    implementation "de.jensd:fontawesomefx-commons:11.0"
    implementation "de.jensd:fontawesomefx-controls:11.0"
    implementation "de.jensd:fontawesomefx-fontawesome:4.7.0-11"
    implementation "de.jensd:fontawesomefx-materialicons:2.2.0-11"
    implementation "de.jensd:fontawesomefx-emojione:2.2.7-11"
}

javafx {
    version = "14"
    modules = [ 'javafx.controls', 'javafx.fxml'/*, 'javafx.web', 'javafx.swing'*/ ]
}

jlink {
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = '<-- name of root module -->'
    }
}

mainClassName = '<-- package.path.to.kotlin.class.extending.tornadofx.Application -->'

launch4j {
    mainClassName = '<-- package.path.to.kotlin.class.extending.tornadofx.Application -->'
}

configurations {
    cucumberRuntime {
        extendsFrom testImplementation
    }
}

task cucumber() {
    dependsOn assemble, compileTestJava
    doLast {
        javaexec {
            main = "io.cucumber.core.cli.Main"
            classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
            args = ['--plugin', 'pretty', '--glue', '<-- root package name -->', 'src/test/resources/features', '--strict']
        }
    }
}

最后,父级版本 gradle 文件:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.70'
}

group '<-- anonymized group name -->'
version '0.1.0'

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"

    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.6.0'
    testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "13" // version issue here?
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "13" // version issue here?
}

test {
    useJUnitPlatform()
}

我真的希望有人有一些见解,我还可以做些什么来建立这个。这真的让我很困惑,因为我一直在IDE中构建和运行它,没有任何问题。

共有2个答案

梁烨烨
2023-03-14

我注意到org.beryx.jlink插件只能在Java 11上使用,在Java 14上我得到了这个错误:

Execution failed for task ':createMergedModule'.
> Unsupported major.minor version 58.0

为了让它工作,我运行了java 11 jlink。在我的build.gradle (gradle-6.3)中,我使用了这个:

jlink {    
   javaHome = '/usr/lib/jvm/jdk-11.0.6+10'
   ......
}

并为jpackage指定了这个来获取java 14版本:

jpackage {
     jpackageHome = '/usr/lib/jvm/jdk-14+36'
     ......
}

也用过这个版本:

plugins {
    id "org.beryx.jlink" version "2.17.4"
}

希望这能有所帮助。

郭兴平
2023-03-14

Gradle 6.3 是最新版本(截至本注释),也是第一个支持 Java 14 的版本。只需升级您的 Gradle 包装器:

./gradlew wrapper --gradle-version=6.3

https://docs.gradle.org/6.3/release-notes.html

 类似资料:
  • 我正在编译我的Android项目,但我遇到了这个错误 我在其他文章中读到,试图用Java 8编译可能会导致错误,但不是我的情况,我有以下Java版本: 操作系统:Linux薄荷(我没有安装Java 8。)构建:MAVEN 有谁能帮我一下吗?

  • 我正在使用JDK附带的Oracle工具为JavaFX8应用程序创建一个可安装的包。在Mac上创建文件,在Linux上使用文件。我从Gradle调用一个Ant脚本来创建包。我遇到的问题是,包中包含的版本号总是1.0,而不是我指定的版本。Ant脚本的相关部分如下: 您可以在这里的上下文中看到完整的脚本。 在Mac上,右键单击应用程序图标并选择“Get Info”显示1.0而不是正确的版本号,正如您在下

  • 为缓解 Windows 下路径名过长的 问题, 略微加快一下 require的速度以及隐藏你的源代码,你可以选择把你的应用打包成 asar档案文件,这只需要对你的源代码做一些很小的改动。 大部分用户可以毫不费力地使用这个功能,因为它electron-packager,、electron-forge和electron-builder中都得到了支持,开箱即用。 如果你没有使用这些工具中的任何一个,那么

  • 我试图在Neo4j JDBC驱动程序中使用Pentaho Kettle 5.0.1a-Stable,但当我试图预览“表输入”步骤的数据时,我得到了以下错误: 在我的。zshrc文件中有这些行 Java版本是1.7.0_60(我使用的是Mac OS X btw) 我克隆了Neo4j-driver并使用Maven构建了它(该驱动程序的最后一次提交是5430d0454180a,它添加了对neo4j2.1

  • 当我开始我的购买流程的时候,我在测试我的应用程序帐单时,我收到了这个错误信息。我在进入google play商店后看到了这条消息。 我已经通读了所有其他的帖子,这些帖子都是关于这个错误的。

  • 我的示例应用程序是最小的: 问题是如何从另一个launcher类启动这个类?