想用 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 1
"kotlin.jvm.internal.Intrinsics" 这个类找不到? kotlin 的 runtime 没有打包? 或者是 classpath 设置的不对?
|
2
SoloCompany 2020-07-05 16:45:22 +08:00
为什么要构造一个多余的匿名类
|
3
napsterwu 2020-07-05 17:39:59 +08:00
jar 包需要 getResourceAsStream
|
4
napsterwu 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) }就好了
|