Я занимаюсь разработкой приложения Tornadofx уже пару месяцев. Он отлично работает в среде IDE (intellij ultimate, win 10), но теперь, когда мне нужно создать настоящий исполняемый файл jar для других людей, я не могу заставить его работать.
I ' Я использую плагин openfx gradle для автоматического сбора зависимостей javafx и предоставления задачи application / run, которую я использовал во время разработки. В документации также указано, что вы включаете org.beryx.jlink в качестве плагина для этого окончательного процесса упаковки. Это приложение tornadofx, я написал все это в Kotlin. Проблема, с которой я столкнулся сейчас, заключается в том, что когда я запускаю задачи jlink, jlinkZip или jpackage (которые, как я предполагаю, предоставит мне распространяемую сборку), я получаю сообщение об ошибке «Unsupported major.minor version 56.0».
Я немного покопался, подумал: «Может быть, мне нужно обновить мой jdk с 12 до 14», поэтому я установил openjdk14, и теперь ошибка «Неподдерживаемая версия major.minor 58.0». Итак, проблема в том, что мой JDK слишком обновлен ...? Я не уверен. Тем не менее, я не знаю, какую версию JDK мне нужно, чтобы получить это для сборки. Я просто не уверен, откуда go отсюда. Некоторые другие исследования, которые я провел, показали, что jlink не работает с kotlin, но плагин gradle 'org.beryx.jlink' называется «Badass jlink» и может работать с Kotlin.
* 1006. * Для дальнейшего понимания у меня есть несколько подмодулей и отдельно встроенная внутренняя библиотека ядра, так что есть много частей, которые можно собрать и собрать вместе. Однако каждый подмодуль 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 -module.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 и tornadofx выглядит следующим образом:
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']
}
}
}
И, наконец, родительский файл build.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 без проблем все это время.