我有一個帶有 Kotlin/JVM 后端和 Kotlin/JS 前端的全堆疊 Kotlin Multiplatform Web 應用程式。
我遇到的問題是,當我去執行 JAR 時,沒有Main-Class清單條目,我收到此錯誤:
$ java -jar shoppinglist-jvm-1.0-SNAPSHOT.jar
no main manifest attribute, in shoppinglist-jvm-1.0-SNAPSHOT.jar
我認為出于某種原因,這是設計使然,并且我遺漏了一些必不可少的東西。
更多詳情:
- 我正在使用Jetbrains 提供的 Ktor 示例專案,但這也以同樣的方式發生在我自己的專案中。
- 我
jvm在 libs 檔案夾中執行 JAR,但我也在js和metadataJAR 上嘗試了它,結果相同。 - 我
gradle build在 IntelliJ 運行配置中使用進行編譯。
使用 7-Zip 提取 JAR 會發現js并且metadata不包含 Java 位元組碼;所以,我現在主要是忽略這些。
但是,jvm有有趣的內容:
- 清單檔案包含不帶
Main-Class. - 有一個 .kotlin_module 檔案確實包含某種類串列,但我不確定如何使用它。
- 位元組碼 .class 和 .js 檔案都在預期的位置。
- 有一個 .tar 和 .zip 檔案,其中包含所有 lib JAR 以及一個似乎應該啟動應用程式的腳本,但它都在一個存檔中。
- 在我的專案中,這些都包含在 JAR 本身中。
- 在其他專案中,這些包含在分發目錄中。
我認為這是我所缺少的一些簡單的東西,但我似乎無法在任何地方找到關于此的檔案或問題。
uj5u.com熱心網友回復:
您有 3 個選項可以使其正常作業。
1. 開箱即用選項
# Build from the root dir
./gradlew clean build
cd build/distributions/
# unzip
tar -xvf shoppinglist-1.0-SNAPSHOT.tar
cd shoppinglist-1.0-SNAPSHOT/bin
# Execute launch script (generated by application plugin)
./shoppinglist
# Result
Hello, JVM!
2.分發選項(我的叉子有變化)
如果您真的想像這樣執行它,我們需要添加我們的自定義分發和編輯清單java -jar shoppinglist-jvm-1.0-SNAPSHOT.jar
application用插件替換distribution插件- 洗掉
application配置塊 - 洗掉這個
tasks.getByName<JavaExec>("run") {
classpath(tasks.getByName<Jar>("jvmJar")) // so that the JS artifacts generated by `jvmJar` can be found and served
}
- 將
distribution配置塊替換為
distributions {
main {
distributionBaseName.set("shoppinglist")
contents {
into("") {
val jvmJar by tasks.getting
from(jvmJar)
}
into("lib/") {
val main by kotlin.jvm().compilations.getting
from(main.runtimeDependencyFiles)
}
}
}
}
tasks.withType<Jar> {
doFirst {
manifest {
val main by kotlin.jvm().compilations.getting
attributes(
"Main-Class" to "ServerKt",
"Class-Path" to main.runtimeDependencyFiles.files.joinToString(" ") { "lib/" it.name }
)
}
}
}
現在你可以像這樣啟動它
# Build from the root dir
./gradlew clean build
cd build/distributions/
# unzip
tar -xvf shoppinglist-1.0-SNAPSHOT.tar
# Run
java -jar shoppinglist-jvm-1.0-SNAPSHOT.jar
# Result
Hello, JVM!
3. uberJar (fatJar) 選項(My Fork with changes)
1. Remove `applicaion` plugin
2. Remove `distributions` and `application` configuration blocks
3. Remove `stage` and `run` tasts
4. Add uberJar task
tasks.withType<Jar> {
doFirst {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
val main by kotlin.jvm().compilations.getting
manifest {
attributes(
"Main-Class" to "ServerKt",
)
}
from({
main.runtimeDependencyFiles.files.filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509877.html
上一篇:為什么kotlin-gradle-plugin無法從CodeInsightTestFixture.configureByText創建PSIFile?
