这与我想要完成的非常接近。如何使用外部 java 库在命令行中编译和运行 kotlin 程序
我真的很想学习如何编译和运行包含库的简单代码,但是在包含类路径时我有点迷失了。
我目前正在尝试编译和运行
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class Project(val name: String, val language: String)
fun main() {
// Serializing objects
val data = Project("kotlinx.serialization", "Kotlin")
val string = Json.encodeToString(data)
println(string) // {"name":"kotlinx.serialization","language":"Kotlin"}
// Deserializing back into objects
val obj = Json.decodeFromString<Project>(string)
println(obj) // Project(name=kotlinx.serialization, language=Kotlin)
}
使用
kotlinc -cp "C:\PROGRA~1\Kotlin\lib\kotlinx-serialization-runtime-1.0-M1-1.4.0-rc.jar" main.kt
用这个编译器编译
https://blog.jetbrains.com/kotlin/2020/07/kotlin-1-4-rc-released/
文章底部允许的 lib 是 kotlinx-serialization-runtime-1.0-M1-1.4.0-rc.jar 的来源。我之所以选择这个运行时 jar,是因为当我使用新的 kotlin 4.0.21 编译器时,它需要您自己构建的 kotlin-serialization-runtime-1.0.1.jar,但是当我下载源代码并运行 gradle build 时,它不需要似乎生成了(单独的问题,但很想知道如何自己构建运行时 jar)
当我尝试跑步时,我得到
Exception in thread "main" java.lang.NoClassDefFoundError: kotlinx/serialization/json/Json
at MainKt.main(main.kt:12)
at MainKt.main(main.kt)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:64)
at org.jetbrains.kotlin.runner.Main.run(Main.kt:149)
at org.jetbrains.kotlin.runner.Main.main(Main.kt:159)
Caused by: java.lang.ClassNotFoundException: kotlinx.serialization.json.Json
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 9 more
我知道我需要在运行时包含一个类路径
kotlin MainKt
但尝试了一切都没有成功
我尝试了许多不同的组合,包括使用和不使用 -Xplugin="C:\PROGRA~1\Kotlin\lib\kotlinx-serialization-compiler-plugin.jar 进行编译似乎没有什么不同,所以我离开了它离开。
我尝试编译为 java .jar 和 kotlin .class 文件似乎都需要在运行时的类路径信息。我宁愿编译成一个 kotlin .class 并将 java 排除在外,直到我真正需要它为止。通过这种方式,我可以了解 java 在我的应用程序中真正在做什么。
我想我真正想知道的是如何确定运行时可执行文件运行所需的内容。我发现这个站点有助于显示依赖关系,但适用于旧版本的 kotlin https://kotlin.binarydoc.org/org.jetbrains.kotlin/kotlin-compiler-dist/1.3.71/package?package=kotlinx.serialization
我也一直在使用https://github.com/google/android-classyshark 和 https://github.com/borisf/classyshark-bytecode-viewer进入 .class 文件
但是当人们在 StackOverflow 上告诉其他人他们需要使用什么类路径来解决他们的问题时,这似乎很神奇。有人可以教我如何在没有gradle的情况下钓鱼吗?
ps 如果有人有任何好的资源来学习 gradle 如何构建项目的内部知识。我在这里看了一点https://docs.gradle.org/current/userguide/userguide.pdf但似乎没有帮助。也许我错过了什么。此外,此页面https://kotlinlang.org/docs/reference/serialization.html#example-json-serialization似乎有我需要的东西,但似乎无法将其转移到命令行需要的东西。
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1")
}
这是什么意思?我认为这是指这个https://github.com/Kotlin/kotlinx.serialization
但是我如何从这个 repo 构建我需要的东西并使用它来让我的应用程序知道它的运行时依赖项在哪里?啊。我真的很想自己弄清楚这一切,但我必须为此向互联网大神跪下。对不起,我的帖子很乱。我爱学习。