Вопрос или проблема
Я пытаюсь создать исполняемый файл (предпочтительно .exe) с помощью Compose Desktop и Kotlin Multiplatform, согласно этому источнику.
- build.gradle.kts:
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.gradle.api.tasks.Copy
plugins {
kotlin("multiplatform") version "1.8.21"
id("org.jetbrains.compose") version "1.6.11"
}
repositories {
mavenCentral()
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
google()
}
kotlin {
jvm {
compilations.all {
kotlinOptions {
jvmTarget = "17"
}
}
}
sourceSets {
val jvmMain by getting {
dependencies {
implementation(compose.desktop.currentOs)
implementation("com.google.code.gson:gson:2.11.0")
}
}
}
}
compose.desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(TargetFormat.Exe)
windows {
packageVersion = "1.0.0"
exePackageVersion = "1.0.0"
installationPath = "${System.getenv("USERPROFILE")}\\DecoderISO8583"
}
}
}
}
// Задача для копирования папки "packager"
val copyPackagerFolder by tasks.register<Copy>("copyPackagerFolder") {
from("src/main/resources/packager") {
include("**/*.json")
}
into("${System.getenv("USERPROFILE")}\\DecoderISO8583\\packager")
doFirst {
val installationDir = file("${System.getenv("USERPROFILE")}\\DecoderISO8583")
if (!installationDir.exists()) {
installationDir.mkdirs()
}
val packagerDir = file("${System.getenv("USERPROFILE")}\\DecoderISO8583\\packager")
if (!packagerDir.exists()) {
packagerDir.mkdirs()
}
}
}
// Убедитесь, что пользовательская задача выполняется после упаковки дистрибуции
tasks.named("package") {
finalizedBy(copyPackagerFolder)
}
- settings.gradle.kts:
- pluginManagement {
repositories {
mavenCentral()
google()
gradlePluginPortal()
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}
plugins {
id("org.jetbrains.kotlin.jvm").version("1.8.21") // Совпадение с версией, используемой в build.gradle.kts
id("org.jetbrains.compose").version("1.6.11") // Использовать плагин Compose
}
}
rootProject.name = "DecoderISO8583"
- gradle.properties:
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
kotlin.code.style=official
kotlin.version=1.8.21 // Совпадение с версией Kotlin, используемой в build.gradle.kts
compose.version=1.6.11
kotlin.compiler.execution.strategy=in-process
org.gradle.warning.mode=all
Когда я пытаюсь создать исполняемый файл, согласно Compose Desktop, задачи показывают на этих изображениях:
Я много раз получаю эту проблему:
Файл сборки ‘C:\Users\xxxxx\OneDrive\Documents\xxxxxxx\DecoderXXXXXXX\build.gradle.kts’ строка: 69
Задача с именем ‘package’ не найдена в корневом проекте ‘DecoderISO8583’.
- Попробуйте:
Запустите с опцией –stacktrace для получения трассировки стека.
Запустите с опцией –info или –debug для получения более подробного вывода.
Запустите с опцией –scan для получения полных сведений.
Получите дополнительную помощь на https://help.gradle.org.
Не имеет значения, каково название задачи Compose Desktop, я получаю ту же ошибку с другим именем задачи.
Моя цель – создать .exe с подключенной внешней папкой, называемой “packager”, которая будет прекрасно работать во время выполнения программы.
Если вы сможете быть более конкретным и детальным. Я очень благодарен вам.
Я надеюсь на решение этой проблемы, с которой мне сложно найти выход. Мне хотелось бы получить объяснение и код, если это возможно.
Ответ или решение
Для решения вашей проблемы с созданием исполняемого файла .exe с использованием Compose Desktop и Kotlin Multiplatform в вашем проекте, давайте разберем основные шаги и устраним возникшую ошибку.
Шаги для решения проблемы
-
Проверьте структуру проекта.
Убедитесь, что ваш проект имеет правильную структуру, необходимую для сборки Kotlin Multiplatform. Ваша папка должна выглядеть следующим образом:DecoderISO8583/ ├── build.gradle.kts ├── settings.gradle.kts ├── gradle.properties ├── src/ │ ├── jvmMain/ │ │ └── kotlin/ // Ваши файлы с кодом │ ├── jvmTest/ │ │ └── kotlin/ // Тесты │ └── main/resources/ │ └── packager/ // Ваши ресурсы
-
Добавьте необходимые зависимости и плагины.
Убедитесь, что ваши плагины и зависимости вbuild.gradle.kts
прописаны корректно. Ваш файл выглядит в целом правильно, но перепроверьте, чтобы не было лишних символов или опечаток. -
Проверьте версию Gradle.
Используйте версию Gradle, совместимую с Kotlin 1.8.21 и Compose 1.6.11. Например,gradle-wrapper.properties
может выглядеть так:distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
-
Запуск процессов сборки.
Вы можете вызвать сборку с помощью следующей команды в вашем терминале:./gradlew build
Если вы всё сделали правильно, должно произойти создание артефактов.
-
Проверьте конфигурацию задачи ‘package’.
Если Gradle выдаёт ошибку "Task with name ‘package’ not found", проверьте, есть ли у вас определение задачиpackage
в вашем скрипте. Храните его в правильном блоке.Так же, убедитесь, что вызываете задачу
package
после успешной сборки проекта. Например:./gradlew package
-
Отладка ошибки.
Если ошибка сохраняется, попробуйте запустить Gradle с ключами--info
или--debug
, чтобы получить более детальную информацию о том, что именно идет не так:./gradlew package --info
Рекомендуемый код build.gradle.kts
Убедитесь, что build.gradle.kts
соответствует следующим требованиям:
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
plugins {
kotlin("multiplatform") version "1.8.21"
id("org.jetbrains.compose") version "1.6.11"
}
repositories {
mavenCentral()
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}
kotlin {
jvm {
compilations.all {
kotlinOptions {
jvmTarget = "17"
}
}
}
sourceSets {
val jvmMain by getting {
dependencies {
implementation(compose.desktop.currentOs)
implementation("com.google.code.gson:gson:2.11.0")
}
}
}
}
compose.desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(TargetFormat.Exe)
windows {
packageVersion = "1.0.0"
exePackageVersion = "1.0.0"
installationPath = "${System.getenv("USERPROFILE")}\\DecoderISO8583"
}
}
}
}
Заключение
После выполнения всех вышеперечисленных шагов попробуйте снова запустить сборку и создать .exe файл. Если у вас возникнут дополнительные ошибки, используйте вывод командной строки для диагностики или предоставьте более подробную информацию об ошибках, чтобы можно было более точно помочь вам.