Kotlin Code编译为Jar以用于Java Project?

时间:2015-08-02 00:49:58

标签: java jar gradle kotlin

我在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中包含上述依赖项?现在罐子只有30kb。我更喜欢不必包含整个Kotlin运行时,而只是在已使用的组件中进行编译。

1 个答案:

答案 0 :(得分:5)

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.**