
想用 kotlin 写一个程序,用 idea 建了个 gradle 工程。需要读取的文本文件放在了 src/main/resources 文件夹中,文件名 readit.txt 。然后用以下程序读,代码如下:
fun main() { println(getResourceAsText("readit.txt")) } fun getResourceAsText(path: String): String { return object {}::class.java.getResourceAsStream(path).bufferedReader().readText() } 使用 idea 直接调用,可用。然后 gradle build 打包成可执行 jar 包,gradle.build 配置文件如下:
plugins { id 'org.jetbrains.kotlin.jvm' version '1.3.72' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } jar { manifest { attributes 'Main-Class': 'MainKt' } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } } 打完 jar 包后,发现 readit.txt 变成在 jar 内根目录下,然后执行程序报错如下:
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at MainKt.getResourceAsText(main.kt) at MainKt.main(main.kt:2) at MainKt.main(main.kt) Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 3 more 请大家指点,为啥会这样感谢大家
1 cppgohan 2020-07-05 15:54:25 +08:00 "kotlin.jvm.internal.Intrinsics" 这个类找不到? kotlin 的 runtime 没有打包? 或者是 classpath 设置的不对? |
2 SoloCompany 2020-07-05 16:45:22 +08:00 为什么要构造一个多余的匿名类 |
3 orcusfox 2020-07-05 17:39:59 +08:00 jar 包需要 getResourceAsStream |
4 orcusfox 2020-07-05 17:40:36 +08:00 看错了 无视我吧 |
5 heavyrainn OP @SoloCompany 在 stackoverflow 直接抓来的 fun… |
6 sorra 2020-07-05 20:07:43 +08:00 依赖项没有打进 jar ?用 Gradle shadowJar plugin 试试 |
7 heavyrainn OP 发现了原因,把 configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }改成 configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }就好了 |