Некорректно собирается jar-файл: no main manifest attribute
Собранный в идее (Intellij IDEA) jar-файл не запускается со следующей ошибкой:
no main manifest attribute, in .../MyJarFilename.jar
Запускать пробую следующей командой: java -jar MyJarFilename.jar
.
MANIFEST.MF выглядит следующим образом:
Manifest-Version: 2.0
Main-Class: lobaevni.et.MainKt
Class-Path: lobaevni.et
build.gradle.kts выглядит следующим образом:
plugins {
kotlin("jvm") version "2.0.20"
kotlin("plugin.serialization") version "2.0.20"
application
}
group = "lobaevni.et"
version = "2.1"
repositories {
mavenCentral()
}
dependencies {
# тут ещё куча всяких зависимостей, не суть...
implementation("org.jetbrains.kotlinx:kotlinx-cli:0.3.5")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
implementation("io.ktor:ktor-server-netty:3.0.0-rc-1")
implementation("org.slf4j:slf4j-simple:2.0.16")
testImplementation(kotlin("test"))
testImplementation("org.mockito.kotlin:mockito-kotlin:3.2.0")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0")
}
tasks.test {
useJUnitPlatform()
}
kotlin {
jvmToolchain(11)
}
Собираю jar-файл в идее через меню Build -> Build artifacts -> Build. Предварительно в File -> Project Structure -> Project settings -> Artifacts добавил конфигурацию для сборки JAR -> From modules with dependencies.
Пересмотрел огромное количество документаций, всяких ответов на форумах по подобной проблеме, но решения так и не нашёл. Пробовал добавлять следующие строки в свой build.gradle.kts
, но это не решало проблему:
application {
mainClass.set("lobaevni.et.MainKt")
}
tasks.withType<Jar> {
manifest {
attributes["Main-Class"] = "lobaevni.et.MainKt"
attributes["Class-Path"] = "lobaevni.et"
}
}
Пробовал полностью чистить кеши идеи, перезапускать её, удалять папки с билдами и т.д. - тоже ни на что не влияло.
Я сразу отмечу, что я не силён в тонкостях сборки и gradle. Я понимаю процесс сборки так, что в мой jar-файл кладутся собранные подключённые библиотеки, которые я использовал в своей программе, также собранная моя программа, и в этом jar-файле это всё аккуратно линкуется с помощью манифеста, в котором собственно и прописывается инструкция для запуска, чтобы java понимала, какой класс является точкой входа (ну это если прям грубо говоря, я просто на пальцах объяснил, как я это всё понимаю). Вот только не доходит никак до java, где лежит мой заветный Main.kt с функцией main
.
Кстати, сам Main.kt выглядит следующим образом (это я уж на всякий случай прикрепил, package указан):
package lobaevni.et
...
fun main(args: Array<String>) {
...
}
Ответы (1 шт):
https://www.jetbrains.com/help/idea/create-your-first-kotlin-app.html?section=Gradle%20Kotlin#run-the-jar - здесь полное актуальное описание, как правильно собирать jar-файл. Указал дополнительные инструкции в build.gradle.kts, jar-файл успешно собрался и теперь запускается как надо. Я раньше по другим инструкциям собирал, как указал в вопросе - так не работает.