And*_*nik 5 java executable-jar gradle kotlin fatjar
我有一个使用 Kotlin 的多模块化 Gradle 项目。其中一个模块具有 main 方法以及对其他模块的依赖关系。我需要从这个模块创建一个可执行的 jar。所以我尝试通过创建这样的 Jar 任务来做到这一点
jar {
manifest {
attributes(
'Main-Class': 'my_package.RunnerKt'
)
}
from {
configurations.compileClasspath.filter{ it.exists() }.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试了Shadow Gradle 插件。在这两种情况下,胖罐子都是按预期创建的,它似乎拥有我所有的类和依赖项。但是当我运行 jar 时,java -jar出现以下错误:
java.lang.NoClassDefFoundError: Could not initialize class my_kotlin_object_classwhere my_kotlin_object_classis just a kotlin objectwith some variables.
在堆栈跟踪中,没有其他异常可能导致此异常,因此似乎只是此类本身存在问题。当我查看罐子时,我可以在那里看到这个文件。
我不明白这是 kotlin 对象本身和可执行 jar 的问题,还是我做错了什么?
所以实际上这背后还有另一个例外!奇怪的是,只要发生异常的类是 a,Kotlin Object我就无法在堆栈跟踪中看到真正的异常(我不知道为什么)。当我object用 a更改时class,我就看到了错误的真正原因。我修复了它,将其改回object,一切都按预期进行。
所以问题本身是我的代码所特有的,但有人也可能从中受益。实际上,在该对象中,我正在读取一些配置文件,val url = ClassLoader.getSystemClassLoader().getResource("path_to_file")
这些文件位于resources\configs我的模块的目录中。将它们打包到 fat jar 后,它们位于configs文件夹内jar的根目录中。
path_to_file是一个以eg开头的相对路径,当我在 IntelliJ 中运行该项目时,它工作正常,但在 fat jar 内,它无法加载文件。对我来说非常令人惊讶的是,解决方案只是从路径中删除前缀,仅保留. 一切都按预期进行。././configs/my_config.json./configs/my_config.json
| 归档时间: |
|
| 查看次数: |
2951 次 |
| 最近记录: |