Подтвердить что ты не робот

Код 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, но только компилировать в используемые компоненты.

4b9b3361

Ответ 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.**