Por que o plugin kotlin gradle não pode ser compilado com o alvo 1.8?

97

Eu tenho o projeto gradle mais simples configurado usando o intellij para kotlin 1.2.10. Aqui está meu arquivo 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"
}

E eu tenho uma interface java simples:

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

Quando eu importo esta interface e tento chamar o myAbsmétodo, ele falha com este erro:

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

Eu criei um aplicativo intellij kotlin e estava funcionando corretamente. É um bug no novo plug-in gradle do Kotlin?

Alisabzevari
fonte
Você tem JDK 8?
Zoe
Sim, e esse problema só acontece quando eu construo o projeto no intellij. gradle no terminal funciona bem!
alisabzevari
Qual é a versão do plugin IDE que você usa? Não consegui reproduzir o erro com o plugin 1.2.21. Se isso acontecer com as versões mais recentes do plug-in Gradle e IDE, você pode registrar um problema em kotl.in/issue e descrever as etapas exatas que levaram ao erro.
tecla de atalho de

Respostas:

182

Acho que isso pode ser útil para quem usa o Android Studio 3.2 no Mac.

Para alterar a versão da JVM de destino do compilador Kotlin, você deve ir para Android Studio -> Preferências -> Compilador Kotlin e, em seguida, alterar a versão da JVM de destino escolhendo no menu suspenso.

De qualquer forma, ainda estou recebendo o seguinte erro

Chamadas para métodos estáticos em interfaces Java são proibidas no destino JVM 1.6. Recompilar com '-jvm-target 1.8'

RESOLVIDO

Adicionar o seguinte ao meu build.gradle resolveu o problema:

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

Sobre esta e outras opções de configuração do Gradle: https://kotlinlang.org/docs/reference/using-gradle.html


Com Kotlin Gradle DSL:

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

(kotlinOptions as KotlinJvmOptions).apply {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
}
Jairo Lozano
fonte
21
Para projetos Android, a versão JVM de destino do compilador Kotlin precisa ser alterada em build.gradle, não nas preferências do Android Studio. As alterações nas preferências do Android Studio não afetarão as compilações de linha de comando.
yole
1
Obrigado por isso, ótima ajuda @yole
Curyous
Obrigado por isso, grande ajuda,
lotosbin
2
Legal, isso ajuda! E appé gradle btw.
Wesely
2
É possível definir isso no arquivo build.gradle raiz? É tedioso gerenciar isso entre módulos em um projeto de vários módulos.
robotsquidward
77

Descobri que era a configuração do meu compilador kotlin nas configurações do Intellij. Em Settings > Build, Execution, Deployment > Compiler > Kotlin Compileruma configuração chamada Target JVM versiondeveria ter sido definida como 1.8.

Alisabzevari
fonte
3
Na minha versão está disponívelSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi
6
Mas mesmo quando definido como 1.8, ainda consigoCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi
Eu não tenho Other Settingsna minha!
alisabzevari
39
No meu caso conserto emProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas
Na verdade, configurei todos os itens acima e nenhuma mensagem mais ... ainda. IJ 2018.1.5 Kotlin 1.2.50.
softjake de
21

Verifique se você tem as três coisas a seguir definidas:

  1. opções kotlin em build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Verifique as preferências de ideias relevantes Preferências

  2. Verifique as facetas do projeto insira a descrição da imagem aqui

Antal Attila
fonte
16

Há uma propriedade gradle usada pelo plugin Kotlin que pode ser usada. Quando você adiciona

kotlin.setJvmTargetFromAndroidCompileOptions = true

ao seu gradle.propertiesarquivo. Quando você tem esta configuração em seubuild.config

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

o problema deve ser resolvido.

Karol Kulbaka
fonte
O projeto no qual eu estava trabalhando tinha sourceCompatibility e targetCompatibilityconfigurado, mas a adição de kotlin.setJvmTargetFromAndroidCompileOptions = trueresolveu o problema para mim
Fdo
6

// Basta adicionar o código abaixo em seu Build gradle (Módulo: app)

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

Isso também é definido nas configurações do projeto, em Project Settings > Modules > Kotlin. Este era o meu problema específico ... literalmente a última coisa que tentei.

Tim Keating
fonte
2

Isso funcionou para mim no Gradle com Kotlin DSL:

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

Não tenho certeza de por que isso funciona, mas você pode tentar alterar a configuração na própria ideia. Como o Gradle da linha de comando funciona, mas não ao compilar a partir do IntelliJ, esta provavelmente é a raiz.

Vá para Arquivo -> Estrutura do Projeto. Vá para a guia Projeto e certifique-se de que o SDK do Projeto é 8 (ou mais recente) e defina o Project language levelpara Java 8

insira a descrição da imagem aqui

A configuração lá parece substituir o Gradle por algum motivo, então alterá-lo deve funcionar

Zoe
fonte
É 8 no meu intellij!
alisabzevari
Tente invalidar os caches e reiniciá
Zoe
Não funcionou. Eu tenho um projeto criado com o intellij mais antigo (o atual é 2017.3.4). O antigo está funcionando. Estou comparando pastas .idea de dois projetos. Isso faz sentido?
alisabzevari
2
Eu tive o mesmo erro em um projeto maven. Acabei de resolver adicionar <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> à seção de propriedades. Dê uma olhada aqui em youtrack.jetbrains.com/issue/KT-17492 para mais informações
Paolo
A configuração "Nível de linguagem do projeto" controla como o código-fonte Java é destacado no IDE. Não tem nenhum impacto na compilação do Kotlin.
yole
1

Configurações> Build, Execution, Deployment> Compiler> Kotlin Compiler, uma configuração chamada Target JVM version deve ter sido definida como 1.8.

Seroj Grigoryan
fonte
0

No meu caso, tentei todas as opções do @alisabzevari, incluindo as fornecidas no comentário, mas não funcionou,

erro meu Eu adicionei o arquivo java também na src/<sourcset_name>kotlin/pasta, depois converti o arquivo java para arquivo kotlin. e Voila! Funciona.

Pode ser que ajude alguém.

Dastan
fonte