Хорошо, так что я новичок в 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"
}
}
Теперь вопросы:
Я пробовал использовать 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? Будет ли мне чего-то не хватать для его использования?
Я хочу разобраться в трех вещах котлина, которые мне пришлось настроить в сценарии. Поправьте меня пожалуйста:
kotlin-gradle-plugin: используется для определения версии Kotlin, которую я буду использовать (?)apply plugin: 'kotlin': Насколько я знаю из Gradle, это должно добавить задачи для работы с Kotlin, но при запуске gradle tasks я не заметил ничего другого ... Так для чего это на самом деле?kotlin-stdlib-jdk7: Я предполагаю, что это библиотека функций, классов и т.д. Kotlin. Но я не понимаю, в чем разница между stdlib и stdlib-jdk7. документация говорит, что он содержит «дополнительные функции расширения». Но какие? Кроме того, я должен определить версию для этого парня? Или автоматически подхватывает версию kotlin-gradle-plugin?Заранее спасибо,




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"
}
}
Версия kotlin-gradle-plugin - это версия компилятора Kotlin, используемого для компиляции вашего кода. Версия stdlib - это версия вашей библиотеки времени выполнения. Здесь настоятельно рекомендуется использовать ту же версию.
apply plugin: kotlin добавляет некоторые задачи под капотом - просто продолжайте использовать java-задачи, такие как gradle assemble, gradle build и gradle run, поскольку они будут вызывать специфические задачи kotlin.
kotlin-stdlib-jdk7 добавляет очень небольшую ценность - если вы не используете функции java-библиотеки, которые были представлены в java 7 а также, которые имеют расширения из stdlib Kotlin, вы можете просто использовать стандартную stdlib по умолчанию (которая нацелена на Java 6 и является зависимостью от kotlin-stdlib-jdk7. в любом случае).
Я спрашиваю обо всем этом, потому что хочу знать, с какими проблемами я могу столкнуться при использовании kotlin-gradle-plugin 1.1.1 ... Еще раз спасибо!
В настоящее время компилятор языка Kotlin требует для запуска JDK 8. проект, скомпилированный с помощью Kotlin, может быть нацелен на любую Java, начиная с Java 6.
Рецепт настройки сборки Gradle проекта, работающего на Java 7, следующий:
jvmTarget = "1.6" в kotlinOptionsjdkHome в kotlinOptionssourceCompatibility, targetCompatibility плагина Javaoptions всех задач компиляции java:
isFork = trueforkOptions.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ãoMenighin Да, вы можете и должны использовать последнюю версию плагина Kotlin Gradle с такой настройкой.
Думаю, у меня получилось. Будучи новичком в gradle, я не знал о возможностях targetCompatibility и т. д. В основном я устанавливал их на 1.7, а цель kotlin - на 1.6. Проверяя сгенерированные .classes, я вижу, что они совместимы с Java 7. Моя точка зрения: я нигде не устанавливал JDK7. Я использовал JDK8 для компиляции в Java 7. Я также не настраивал эту вашу опцию вилки. Кажется, все работает ... Как вы думаете, необходимо установить jdkHome на java 7?
Да, вам следует установить jdkHome, иначе вы рискуете случайно использовать API JDK 8, что приведет к сбою во время выполнения.
Спасибо! На всякий случай сделаю. Но я протестировал, и попытки использовать stream уже дали мне ошибку разметки в IntelliJ.
Спасибо за ответ @ 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? Может быть, оптимизированный код?