[英]java.lang.NoClassDefFoundError: Could not initialize class - Kotlin Object
我有一個帶有 Kotlin 的多模塊 Gradle 項目。其中一個模塊具有主要方法和對其他模塊的依賴性。 我需要從這個模塊創建一個可執行文件 jar。 所以我試圖通過創建這樣的 Jar 任務來做到這一點
jar {
manifest {
attributes(
'Main-Class': 'my_package.RunnerKt'
)
}
from {
configurations.compileClasspath.filter{ it.exists() }.collect { it.isDirectory() ? it : zipTree(it) }
}
}
而且我還嘗試了Shadow Gradle 插件。 在這兩種情況下,fat jar 都是按預期創建的,它似乎包含我所有的類和依賴項。 但是,當我使用java -jar
運行 jar 時,出現以下錯誤: java.lang.NoClassDefFoundError: Could not initialize class my_kotlin_object_class
where my_kotlin_object_class
is just a object
with some variables.
在堆棧跟蹤中,沒有其他可能導致此異常的異常,所以它似乎只是這個 class 本身有問題。 當我查看 jar 時,我可以在那里看到這個文件。
我不明白這是 kotlin object 本身和可執行文件 jars 的問題,還是我做錯了什么?
所以其實這背后還有一個例外! 奇怪的是,只要發生異常的 class 是Kotlin Object
我就無法在堆棧跟蹤中看到真正的異常(我不知道為什么)。 一旦我將class
更改為object
,我就看到了錯誤的真正原因。 我修復了它,將其改回object
,一切都按預期進行。
所以問題本身是我的代碼特有的,但也有人可能會從中受益。 實際上,在那個 object 中,我正在使用val url = ClassLoader.getSystemClassLoader().getResource("path_to_file")
讀取一些配置文件,這些文件位於我模塊的resources\configs
目錄中。 在將它們打包成 fat jar 后,它們位於configs文件夾內jar的根目錄中。
path_to_file是一個以./
例如./configs/my_config.json
開頭的相對路徑,當我在 IntelliJ 中運行該項目時它工作正常,但在 fat jar 中它無法加載文件。 對我來說非常令人驚訝的解決方案只是從路徑中刪除./
前綴,只留下configs/my_config.json
。 一切都按預期進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.