¿Por qué el complemento kotlin gradle no se puede compilar con el objetivo 1.8?

93

Tengo el proyecto gradle más simple configurado usando intellij para kotlin 1.2.10. Aquí está mi archivo build.gradle:

buildscript {
    ext.kotlin_version = '1.2.10'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

group 'com.ali'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

Y tengo una interfaz java simple:

public interface MyMath {
    static int myAbs(int input) {
        return Math.abs(input);
    }
}

Cuando importo esta interfaz e intento llamar al myAbsmétodo, falla con este error:

Error:(6, 12) Kotlin: Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'

He creado una aplicación intellij kotlin y estaba funcionando correctamente. ¿Es un error en el nuevo complemento gradle de Kotlin?

alisabzevari
fuente
¿Tiene JDK 8?
Zoe
Sí, y este problema solo ocurre cuando construyo el proyecto en intellij. gradle en la terminal funciona bien!
alisabzevari
¿Cuál es la versión del complemento IDE que usa? No pude reproducir el error con el complemento 1.2.21. Si eso también sucede con las versiones más recientes del complemento Gradle e IDE, puede presentar un problema en kotl.in/issue y describir los pasos exactos que conducen al error.
tecla

Respuestas:

179

Creo que esto podría ser útil para aquellos que usan Android Studio 3.2 en Mac.

Para cambiar la versión de JVM de destino del compilador de Kotlin, debe ir a Android Studio -> Preferencias -> Compilador de Kotlin y luego cambiar la versión de JVM de destino eligiendo en el menú desplegable.

De todos modos, sigo recibiendo el siguiente error

Las llamadas a métodos estáticos en interfaces Java están prohibidas en JVM target 1.6. Vuelva a compilar con '-jvm-target 1.8'

RESUELTO

Agregar lo siguiente a mi build.gradle resolvió el problema:

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

Acerca de esta y otras opciones de configuración de Gradle: https://kotlinlang.org/docs/reference/using-gradle.html


Con Kotlin Gradle DSL:

import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions

(kotlinOptions as KotlinJvmOptions).apply {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
}
Jairo Lozano
fuente
20
Para proyectos de Android, la versión de JVM de destino del compilador de Kotlin debe cambiarse en build.gradle, no en las preferencias de Android Studio. Los cambios en las preferencias de Android Studio no afectarán las compilaciones de la línea de comandos.
yole
1
Gracias por esto, gran ayuda @yole
Curyous
Gracias por esto, gran ayuda
lotosbin
2
¡Genial, ayuda! Y appes gradle por cierto.
Wesely
2
¿Es posible establecer esto en el archivo root build.gradle? Es tedioso administrar esto en todos los módulos en un proyecto de varios módulos.
Robotquidward
75

Resultó que era mi configuración del compilador kotlin en la configuración de intellij. En Settings > Build, Execution, Deployment > Compiler > Kotlin Compileruna configuración llamada Target JVM versiondebería haberse establecido en 1.8.

alisabzevari
fuente
3
En mi versión está enSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi
6
Pero incluso cuando se establece en 1.8, todavía obtengoCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi
¡No tengo Other Settingsen el mío!
alisabzevari
38
En mi caso lo soluciono enProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas
En realidad, configuré todo lo anterior y no más mensaje ... todavía. IJ 2018.1.5 Kotlin 1.2.50.
softjake
21

Compruebe si tiene las siguientes tres cosas configuradas en la idea:

  1. opciones de kotlin en build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Verifique las preferencias de Idea relevantes Preferencias

  2. Ver las facetas del proyecto ingrese la descripción de la imagen aquí

Antal Atila
fuente
16

Hay una propiedad gradle utilizada por el complemento Kotlin que se puede usar. Cuando agregas

kotlin.setJvmTargetFromAndroidCompileOptions = true

a su gradle.propertiesarchivo. Cuando tenga esta configuración en subuild.config

android{
  compileOptions {
      sourceCompatibility = 1.8
      targetCompatibility = 1.8
  }
}

El problema debe resolverse.

Karol Kulbaka
fuente
El proyecto en el que estaba trabajando tenía sourceCompatibility y targetCompatibilityconfigurado, pero al agregarlo kotlin.setJvmTargetFromAndroidCompileOptions = trueresolvió el problema para mí
Fdo
6

// Simplemente agregue el siguiente código en su Build gradle (Módulo: aplicación)

compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jvmTarget = "1.8"
    }
 }
Ramadas Sivakumar
fuente
1

No estoy seguro de por qué funciona esto, pero puede intentar cambiar la configuración en la propia Idea. Dado que Gradle desde la línea de comandos funciona, pero no cuando se construye desde IntelliJ, esta es probablemente la raíz.

Vaya a Archivo -> Estructura del proyecto. Vaya a la pestaña Proyecto y asegúrese de que Project SDK sea 8 (o más reciente) y configure el Project language levelen Java 8

ingrese la descripción de la imagen aquí

La configuración allí parece anular a Gradle por alguna razón, por lo que cambiarla debería funcionar

Zoe
fuente
¡Es 8 en mi intellij!
alisabzevari
Intente invalidar las cachés y reiniciar
Zoe
No funcionó. Tengo un proyecto creado con intellij anterior (el actual es 2017.3.4). El viejo está funcionando. Estoy comparando carpetas .idea de dos proyectos entre sí. ¿Tiene sentido?
alisabzevari
2
Tuve el mismo error en un proyecto de maven. Simplemente resuelto agregando <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> a la sección de propiedades. Eche un vistazo aquí youtrack.jetbrains.com/issue/KT-17492 para obtener más información
Paolo
La configuración "Nivel de idioma del proyecto" controla cómo se resalta el código fuente de Java en el IDE. No tiene ningún impacto en la compilación de Kotlin en absoluto.
yole
1

Esto también se establece en la configuración del proyecto, en Project Settings > Modules > Kotlin. Este fue mi problema específico ... literalmente lo último que intenté.

Tim Keating
fuente
1

Esto funcionó para mí en Gradle con Kotlin DSL:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
Ayush
fuente
0

En mi caso, probé todas las opciones de @alisabzevari, incluidas las dadas en el comentario, pero no funcionó,

mi error agregué el archivo java también en la src/<sourcset_name>kotlin/carpeta, luego convertí el archivo java al archivo kotlin. ¡y voilá! Funciona.

Puede que ayude a alguien.

dastan
fuente