sdkman + kotlin

В скором времени мне потребуется расширить свой стек ещё одним языком программирования — Kotlin. Меня не беспокоит процесс погружения в синтаксис, это самое простое, что может быть. Как и всегда, во главу угла я ставлю вопрос о простоте, скорости и воспроизводимости развёртывания, особенно локального окружения разработчика — в команде я буду работать не один, и важно, чтобы версии компиляторов совпадали у моих коллег до миллибитов.

Установка Kotlin на локальной машине требует установки JDK. Многие скажут: “ну, иди скачай, в чём проблема?” Проблема всё та же — идентичное окружение для всех членов команды.

Точно так же, как и в случае с asdf, для подобных java-решений есть отдельный, хорошо зарекомендовавший себя менеджер JDKsdkman. Он позволяет:

  • устанавливать различные версии JDK;
  • устанавливать их не в /opt или /usr/local (что меня лично всегда огорчает), а в отдельный скрытый каталог внутри домашнего;
  • менять выбор текущего JDK по умолчанию;
  • ставить отдельные нужные версии инструментов, такие как Gradle, Maven, Ballerina и прочие.

Процесс установки sdkman описан на официальном сайте. Я покажу, как установить JDK и Kotlin:

sdk install java 20.0.1-oracle
sdk install kotlin # самая свежая версия

Несколько слов о компиляции вручную. Понятно, что на крупных проектах всегда есть система сборки, без неё никуда. Но если вы только знакомитесь с языком, вам хочется получить результат быстрее, не создавая проект.

Допустим, вы создали файл hello.kt:

fun main(args: Array<String>) {
  var hello = "Hello, Kotlin!"
  println(hello)
}

И хотите его скомпилировать в jar:

kotlinc hello.kt -d hello.jar

При запуске, вы, скорее всего получите следующую ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
        at HelloKt.main(hello.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 1 more

Чтобы её избежать, необходимо включить runtime в ваш jar:

kotlinc hello.kt -include-runtime -d hello.jar

Теперь ваш файл запустится без проблем:

java -jar hello.jar
Hello, Kotlin!

Успехов в освоении Kotlin и устанавливайте необходимое ПО, соблюдая Unix-way.

Ссылки