kotlin gradle 플러그인이 1.8 대상으로 빌드 할 수없는 이유는 무엇입니까?


93

kotlin 1.2.10에 대해 intellij를 사용하여 구성된 가장 간단한 gradle 프로젝트가 있습니다. 다음은 내 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"
}

그리고 간단한 자바 인터페이스가 있습니다.

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

이 인터페이스를 가져오고 myAbs메서드 를 호출하려고 하면 다음 오류와 함께 실패합니다.

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

intellij kotlin 앱을 만들었는데 제대로 작동했습니다. 새로운 Kotlin Gradle 플러그인의 버그입니까?


JDK 8이 있습니까?
Zoe

예,이 문제는 intellij에서 프로젝트를 빌드 할 때만 발생합니다. 터미널의 gradle이 잘 작동합니다!
alisabzevari

사용하는 IDE 플러그인 버전은 무엇입니까? 1.2.21 플러그인으로 오류를 재현 할 수 없습니다. 최신 Gradle 및 IDE 플러그인 버전에서도 이러한 문제가 발생하는 경우 kotl.in/issue 에서 문제를 제출 하고 오류로 이어지는 정확한 단계를 설명 할 수 있습니다 .
hotkey

답변:


179

Mac에서 Android Studio 3.2를 사용하는 사람들에게 도움이 될 수 있다고 생각합니다.

Kotlin Compiler Target JVM 버전을 변경하려면 Android Studio-> Preferences-> Kotlin Compiler로 이동 한 다음 드롭 다운에서 선택한 Target JVM 버전을 변경해야합니다.

어쨌든 여전히 다음과 같은 오류가 발생합니다.

Java 인터페이스의 정적 메서드에 대한 호출은 JVM 대상 1.6에서 금지됩니다. '-jvm-target 1.8'로 다시 컴파일하십시오.

해결

내 build.gradle에 다음을 추가하면 문제가 해결되었습니다.

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

이것 및 기타 Gradle 구성 옵션 정보 : https://kotlinlang.org/docs/reference/using-gradle.html


Kotlin Gradle DSL 사용 :

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

(kotlinOptions as KotlinJvmOptions).apply {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
}

20
Android 프로젝트의 경우 Kotlin 컴파일러 대상 JVM 버전을 Android 스튜디오 환경 설정이 아닌 build.gradle에서 변경해야합니다. Android 스튜디오 환경 설정의 변경 사항은 명령 줄 빌드에 영향을주지 않습니다.
yole

1
이 주셔서 감사합니다, 많은 도움의 @yole
Curyous

이 주셔서 감사합니다, 큰 도움이,
lotosbin

2
좋아요, 도움이됩니다! 그리고 그것은 appgradle btw입니다.
Wesely

2
루트 build.gradle 파일에서 이것을 설정할 수 있습니까? 다중 모듈 프로젝트의 모듈 전체에서이를 관리하는 것은 지루합니다.
robotsquidward

75

intellij 설정에서 내 kotlin 컴파일러 구성이라는 것이 밝혀졌습니다. 에서 Settings > Build, Execution, Deployment > Compiler > Kotlin Compiler라는 설정을 Target JVM version1.8로 설정되어 있어야합니다.


3
내 버전에서Settings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi

6
하지만 1.8로 설정해도 여전히 나타납니다Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi

나는이없는 Other Settings광산에서!
alisabzevari

38
내 경우에는 수정Project Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas

사실, 나는 위의 모든 것을 설정하고 더 이상 메시지를 ... 아직 설정하지 않았습니다. IJ 2018.1.5 Kotlin 1.2.50.
softjake

21

다음 세 가지 아이디어가 있는지 확인하십시오.

  1. build.gradle의 kotlin 옵션
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. 관련 아이디어 기본 설정 확인 환경 설정

  2. 프로젝트 패싯 확인 여기에 이미지 설명 입력


16

사용할 수있는 Kotlin 플러그인에서 사용하는 gradle 속성이 있습니다. 추가 할 때

kotlin.setJvmTargetFromAndroidCompileOptions = true

당신에 gradle.properties파일. 이 구성이있는 경우build.config

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

해결 될 문제입니다.


내가 가진 작업 한 프로젝트 sourceCompatibility targetCompatibility구성하지만 추가는 kotlin.setJvmTargetFromAndroidCompileOptions = true나를 위해 문제를 해결
FDO

6

// Build gradle (Module : app)에 아래 코드를 추가하기 만하면됩니다.

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

1

이것이 작동하는 이유는 확실하지 않지만 아이디어 자체에서 설정을 변경해 볼 수 있습니다. 명령 줄의 Gradle은 작동하지만 IntelliJ에서 빌드 할 때는 작동하지 않으므로 이것이 아마도 루트 일 것입니다.

파일-> 프로젝트 구조로 이동하십시오. 프로젝트 탭으로 이동하여 프로젝트 SDK가 8 (또는 그 이상)인지 확인하고 Project language level를 Java 8로 설정하십시오.

여기에 이미지 설명 입력

거기에있는 구성은 어떤 이유로 Gradle을 재정의하는 것처럼 보이므로 변경하면 작동합니다.


내 intellij에서 8입니다!
alisabzevari

캐시를 무효화하고 다시 시작하십시오
Zoe

작동하지 않았습니다. 이전 intellij로 만든 프로젝트가 있습니다 (현재는 2017.3.4). 오래된 것이 작동합니다. 두 프로젝트의 .idea 폴더를 서로 비교하고 있습니다. 말이 되나요?
alisabzevari

2
메이븐 프로젝트에서 같은 오류가 발생했습니다. 속성 섹션에 <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget>을 추가하는 문제를 해결했습니다. 자세한 정보 는 여기 youtrack.jetbrains.com/issue/KT-17492 를 참조하십시오
Paolo

"프로젝트 언어 수준"설정은 IDE에서 Java 소스 코드가 강조 표시되는 방식을 제어합니다. Kotlin 컴파일에는 전혀 영향을 미치지 않습니다.
yole

1

이것은 아래의 프로젝트 설정에서도 설정됩니다 Project Settings > Modules > Kotlin. 이것은 내 특정 문제였습니다. 말 그대로 내가 시도한 마지막 일이었습니다.


1

이것은 Kotlin DSL을 사용하는 Gradle에서 저에게 효과적이었습니다.

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

0

제 경우에는 주석에 제공된 것을 포함하여 모든 @alisabzevari 옵션을 시도했지만 작동하지 않았습니다.

내 실수로 src/<sourcset_name>kotlin/폴더에 자바 파일을 추가했는데 나중에 자바 파일을 kotlin 파일로 변환했습니다. 그리고 짜잔! 효과가있다.

누군가를 도울 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.