Kotlin代码编译为Jar用于Java Project?

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

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

 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中的上述依赖项? 现在这个罐子只有30kb。 我宁愿不必包含整个Kotlin运行时,但只能在使用的组件中编译。

Kotlin二进制文件使用运行时的一些类,但是这些类的确切集合是未指定的,甚至可能在次要版本之间也会改变,所以不应该依赖于你提供的列表。 您最好的选择是使用-include-runtime选项包含完整的Kotlin运行-include-runtime ,然后运行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.**kotlin.reflect.**