加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

编译为Jar的Kotlin代码用于Java项目?

发布时间:2020-12-14 16:34:19 所属栏目:Java 来源:网络整理
导读:我在Kotlin编写了一个 Java库,我想把它编译成一个可以被Java和Kotlin应用程序使用的jar. 这个想法是,jar应该能够在Java项目上工作,而Kotlin项目.做一个简单的./gradlew clean组合生成一个jar,当我检查jar时,我可以看到几个不包含在jar中的导入,正常的Java应
我在Kotlin编写了一个 Java库,我想把它编译成一个可以被Java和Kotlin应用程序使用的jar.

这个想法是,jar应该能够在Java项目上工作,而Kotlin项目.做一个简单的./gradlew clean组合生成一个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下.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读