gpt4 book ai didi

java - Kotlin 代码编译成 Jar 用于 Java 项目?

转载 作者:IT老高 更新时间:2023-10-28 13:35:24 25 4
gpt4 key购买 nike

我用 Kotlin 编写了一个 Java 库,我想将它编译成一个可供 Java 和 Kotlin 应用程序使用的 jar。

这个想法是 jar 应该能够在 Java 项目和 Kotlin 项目上工作。执行一个简单的 ./gradlew clean assemble 会生成一个 jar,当我检查 jar 时,我可以看到一些未包含在 jar 中的导入,而普通 Java 应用程序也无法访问:

import jet.runtime.typeinfo.JetValueParameter;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.KotlinClass;
import kotlin.jvm.internal.KotlinClass.Kind;
import kotlin.jvm.internal.KotlinSyntheticClass;
import kotlin.jvm.internal.KotlinSyntheticClass.Kind;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

如何在 jar 中包含上述依赖项?现在这个jar只有30kb。我也希望不必包含整个 Kotlin 运行时,而只在使用的组件中进行编译。

最佳答案

Kotlin 二进制文件确实使用了运行时中的一些类,但这些类的确切集合是未指定的,即使在次要版本之间也可能会发生变化,因此您不应依赖您提供的列表。您最好的选择是使用 -include-runtime 选项包含完整的 Kotlin 运行时,然后运行 ​​ProGuard(如注释中所述)以排除未使用的类。

您可以使用这个最小的 ProGuard 配置文件:

-injars input.jar
-outjars output.jar
-libraryjars <java.home>/lib/rt.jar

-keep class org.jetbrains.annotations.** {
public protected *;
}

-keep class kotlin.jvm.internal.** {
public protected *;
}

-keepattributes Signature,InnerClasses,EnclosingMethod

-dontoptimize
-dontobfuscate

如果您使用反射 (kotlin-reflect.jar),您还应该将所有内容保留在 kotlin.reflect.**

关于java - Kotlin 代码编译成 Jar 用于 Java 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31767629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com