3

我有一个带有 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 Plugin。在这两种情况下,胖 jar 都是按预期创建的,它似乎包含了我所有的类和依赖项。但是当我运行 jar 时java -jar出现以下错误: java.lang.NoClassDefFoundError: Could not initialize class my_kotlin_object_classwhere my_kotlin_object_classis just a kotlin objectwith some variables。

在堆栈跟踪中,没有其他可能导致此异常的异常,因此似乎只是这个类本身存在问题。当我查看 jar 时,我可以在那里看到这个文件。

我不明白这是 kotlin 对象本身和可执行 jar 的问题,还是我做错了什么?

4

1 回答 1

3

所以实际上这背后还有另一个例外!奇怪的是,只要发生异常的类是a,Kotlin Object我就无法在stacktrace中看到真正的异常(我不知道为什么)。一旦我object用 a更改了,class我就看到了错误的真正原因。我修复了它,改回它object,一切都按预期工作。

所以问题本身是我的代码特有的,但也有人可能从中受益。实际上,在那个对象中,我正在读取一些配置文件,val url = ClassLoader.getSystemClassLoader().getResource("path_to_file") 这些文件位于resources\configs我的模块目录中。将它们打包成胖罐后,它们位于configs文件夹内罐子的根目录中。

path_to_file./是一个以eg开头的相对路径,当./configs/my_config.json我在 IntelliJ 中运行项目时它工作正常,但是在 fat jar 中它无法加载文件。对我来说非常令人惊讶的解决方案就是./从路径中删除前缀,只保留configs/my_config.json. 一切都按预期工作。

于 2020-08-19T14:19:17.447 回答