簡體   English   中英

java.lang.NoClassDefFoundError: 無法初始化 class - Kotlin Object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM