Код Kotlin, скомпилированный в Jar для использования в Java Project?
Я написал библиотеку Java в Kotlin, и я хотел бы скомпилировать ее в банке, которая может использоваться приложениями Java и Kotlin.
Идея заключается в том, что банка должна работать над проектами Java и проектами Kotlin. Выполнение простого ./gradlew clean assemble
генерирует банку, и когда я проверяю банку, я вижу несколько импортных файлов, которые не включены в банку, что обычные приложения 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;
Как я могу включить вышеупомянутые зависимости в банку? Прямо сейчас банку всего 30кб. Я бы предпочел не включать все время выполнения Kotlin, но только компилировать в используемые компоненты.
Ответы
Ответ 1
Двоичные файлы Kotlin используют некоторые классы из среды выполнения, но точный набор этих классов не указан и может меняться даже между младшими версиями, поэтому вы не должны полагаться на список, который вы предоставили. Ваш лучший вариант - включить полное время выполнения 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.**