Настройте Gradle для Kotlin с Java 1.7

Хорошо, так что я новичок в Gradle и Kotlin, и мне трудно понять, как все здесь склеивается ...

Мне нужно настроить проект, который должен работать на Java 7 (ограничения клиента -_-), и я хочу использовать с ним Kotlin.

Прямо сейчас у меня есть следующий файл build.gradle, который работает, но я хочу спросить несколько вещей, которые я не мог найти больше нигде:

buildscript {
    ext {
        springBootVersion = '1.5.15.RELEASE'
        kotlin_version = '1.1.1'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

group = 'com.springkotlin'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.7
targetCompatibility = 1.7

repositories {
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-data-rest')
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('com.onelogin:java-saml:2.3.0')
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7"
    runtime('org.springframework.boot:spring-boot-devtools')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.springframework.security:spring-security-test')
    testCompile group: 'javax.inject', name: 'javax.inject', version: '1'
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.6"
    }
}

Теперь вопросы:

  1. Я пробовал использовать kotlin_version = '1.2.70' (выпущенный в последние дни!) И получил ошибку KotlinPluginWrapper : Unsupported major.minor version 52.0. Я предполагаю, что это связано с тем, что Kotlin 1.2.X может "компилировать" (это слово?) Только с Java 8+. Это правильно? Подходит ли здесь 1.1.1 или есть способ использовать 1.2.70, который работал бы с Java 7? Будет ли мне чего-то не хватать для его использования?

  2. Я хочу разобраться в трех вещах котлина, которые мне пришлось настроить в сценарии. Поправьте меня пожалуйста:

    • kotlin-gradle-plugin: используется для определения версии Kotlin, которую я буду использовать (?)
    • apply plugin: 'kotlin': Насколько я знаю из Gradle, это должно добавить задачи для работы с Kotlin, но при запуске gradle tasks я не заметил ничего другого ... Так для чего это на самом деле?
    • kotlin-stdlib-jdk7: Я предполагаю, что это библиотека функций, классов и т.д. Kotlin. Но я не понимаю, в чем разница между stdlib и stdlib-jdk7. документация говорит, что он содержит «дополнительные функции расширения». Но какие? Кроме того, я должен определить версию для этого парня? Или автоматически подхватывает версию kotlin-gradle-plugin?

Заранее спасибо,

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
2 595
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Kotlin может ориентироваться как на Java 6, так и на Java 8, и я не думаю, что это изменилось. Однако вполне вероятно, что значение по умолчанию изменилось с Java 6 на Java 8, поэтому попробуйте использовать предложено здесь:

    compileKotlin {
        sourceCompatibility = JavaVersion.VERSION_1_6
        targetCompatibility = JavaVersion.VERSION_1_6
    
        kotlinOptions {
            jvmTarget = "1.6"
            apiVersion = "1.2"
            languageVersion = "1.2"
        }
    }
    
  2. Версия kotlin-gradle-plugin - это версия компилятора Kotlin, используемого для компиляции вашего кода. Версия stdlib - это версия вашей библиотеки времени выполнения. Здесь настоятельно рекомендуется использовать ту же версию.

  3. apply plugin: kotlin добавляет некоторые задачи под капотом - просто продолжайте использовать java-задачи, такие как gradle assemble, gradle build и gradle run, поскольку они будут вызывать специфические задачи kotlin.

  4. kotlin-stdlib-jdk7 добавляет очень небольшую ценность - если вы не используете функции java-библиотеки, которые были представлены в java 7 а также, которые имеют расширения из stdlib Kotlin, вы можете просто использовать стандартную stdlib по умолчанию (которая нацелена на Java 6 и является зависимостью от kotlin-stdlib-jdk7. в любом случае).

Спасибо за ответ @ msrd0. Я сделал то, что вы сказали на шаге 1, и, к моему удивлению, кажется, что теперь я использую Kotlin 1.2 (по крайней мере, метод arrayOf сейчас работает). Итак, чтобы все было правильно: теперь я использую Kotlin Compiler 1.1.1 (kotlin-gradle-plugin) для компиляции языка kotlin 1.2 в Java 6. Это все? Если да, то что бы изменилось, если бы я мог использовать kotlin-gradle-plugin 1.2.70? Может быть, оптимизированный код?

João Menighin 17.09.2018 13:52

Я спрашиваю обо всем этом, потому что хочу знать, с какими проблемами я могу столкнуться при использовании kotlin-gradle-plugin 1.1.1 ... Еще раз спасибо!

João Menighin 17.09.2018 13:52
Ответ принят как подходящий

В настоящее время компилятор языка Kotlin требует для запуска JDK 8. проект, скомпилированный с помощью Kotlin, может быть нацелен на любую Java, начиная с Java 6.

Рецепт настройки сборки Gradle проекта, работающего на Java 7, следующий:

  • запустить Gradle с Java 8 или новее
  • для всех задач компиляции Kotlin
    • укажите jvmTarget = "1.6" в kotlinOptions
    • укажите путь к JDK 7 в jdkHome в kotlinOptions
  • если ваш проект содержит код Java, укажите свойства соглашения sourceCompatibility, targetCompatibility плагина Java
  • укажите следующий options всех задач компиляции java:
    • isFork = true
    • forkOptions.javaHome = "<path to JDK 7>"
  • для всех тестовых заданий укажите executable как "<path to JDK 7>/bin/java"

Полный образец:

sourceCompatibility = 1.7
targetCompatibility = 1.7

def JDK_7 = System.getenv("JDK_7") // or some other way to get path to JDK 7 installation

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
    kotlinOptions {
        jvmTarget = "1.6"
        jdkHome = JDK_7
    }
}

tasks.withType(JavaCompile) {
    options.fork = true
    options.forkOptions.javaHome = file(JDK_7)
}

test {
    executable = "$JDK_7/bin/java"
}

Спасибо за ответ Илья! Если я правильно понял, вот так я могу использовать самую последнюю версию kotlin-gradle-plugin, верно? Мне просто нужно запустить его с Java 8. Проведу небольшое тестирование! Спасибо!

João Menighin 19.09.2018 01:48

@ JoãoMenighin Да, вы можете и должны использовать последнюю версию плагина Kotlin Gradle с такой настройкой.

Ilya 19.09.2018 17:27

Думаю, у меня получилось. Будучи новичком в gradle, я не знал о возможностях targetCompatibility и т. д. В основном я устанавливал их на 1.7, а цель kotlin - на 1.6. Проверяя сгенерированные .classes, я вижу, что они совместимы с Java 7. Моя точка зрения: я нигде не устанавливал JDK7. Я использовал JDK8 для компиляции в Java 7. Я также не настраивал эту вашу опцию вилки. Кажется, все работает ... Как вы думаете, необходимо установить jdkHome на java 7?

João Menighin 19.09.2018 19:13

Да, вам следует установить jdkHome, иначе вы рискуете случайно использовать API JDK 8, что приведет к сбою во время выполнения.

Ilya 19.09.2018 20:36

Спасибо! На всякий случай сделаю. Но я протестировал, и попытки использовать stream уже дали мне ошибку разметки в IntelliJ.

João Menighin 19.09.2018 20:44

Другие вопросы по теме