Невозможно встроить байт-код, созданный с целью 1.8 JVM, в байт-код, который создается с целью 1.6 JVM


488

При попытке запустить Пример CorDapp ( https://github.com/corda/cordapp-example ) через IntelliJ я получаю следующую ошибку:

Невозможно встроить байт-код, созданный с целью 1.8 JVM, в байт-код, который создается с целью 1.6 JVM

Как я могу изменить настройки IntelliJ, чтобы весь байт-код создавался с одной и той же целью JVM?


5
Я смог решить эту проблему, добавив эту библиотеку в build.gradleзависимости {compile ("org.jetbrains.kotlin: kotlin-stdlib-jdk8")}
Munish Chandel,

1
@MunishChandel Этого недостаточно. Мы также должны сделать то, что предлагает ответ ниже ...
Игорь Ганапольский

Ответы:


1040

Приложение / build.gradle

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8.toString()
    }
}

GL

Используйте возможности языка Java 8


32
Это должно быть проверенное решение.
Фил

9
На данный момент и Android Studio v3.5 это единственное решение, которое сработало, после того, как все остальное попробовал. Как ни странно, установка того же значения в Настройки> Kotlin Compiler не имеет никакого эффекта.
user3399299

53
Просто kotlinOptions { jvmTarget = "1.8" }должно хватить.
Петтер

2
сработал, и ответ
Викас Пандей

4
Затем следует «аннулировать кэш и перезапустить»
B-GangsteR

215

Вы можете исправить эту проблему следующим образом:

  • Откройте настройки IntelliJ
  • Перейти к Build, Execution, Deployment> Compiler> Kotlin Compiler НО Other Settings > Kotlin compilerесли Android Studio>3.4
  • Изменение Target JVM versionTo1.8
  • щелчок Apply

6
Я уже установил этот параметр на 1,8, но я все еще вижу эту ошибку при переходе через точки останова. В первую очередь я вижу это при обращении к запросам хранилища. Есть еще предложения? Кажется, этот целевой бит JVM не исправляет это полностью.
Арсалан Халид

38
В вашей структуре проекта , убедитесь , что вы также изменить Target platformдля виртуальной машины Java 1.8 на вашем KotlinFacet под Generalвкладкой.
Анюль Ривас

7
Эта ошибка может появиться, если есть неразрешенная зависимость !
programaths

5
Для меня Kotlin Compiler настройки были фактически размещены в Other Settingsразделе.
qwertyfinger

10
Если перезапуска после применения недостаточно → Перезапустить и сделать недействительными кэши.
Бартек Липински

104

вы должны настроить что-то вроде следующего в build.gradle

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

14
Или, альтернативно, в Gradle Kotlin DSL:tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
breandan

Любая идея, как заставить это работать с kotlin-androidплагином?
ZeroDivide

Работает без особых хлопот. Я бы порекомендовал это
Митч

У меня было это в build.gradle, но каким-то образом IDEA перезаписал этот параметр. Ответ от Саида работал на меня.
Нильс Петерсон

Добавьте это в раздел андроида {} Gradle уровня своего приложения.
Параг Кадам

80

В моем случае просто поменять Target JVM Version следующим образом: File> Setting> Kotlin Compiler> Target JVM Version> 1.8 не помогло. Однако, это решило ошибку времени компиляции. Но не удалось во время выполнения.

Мне также пришлось добавить следующее в файл app build.gradle, чтобы он работал.

 android {
     // Other code here...
     kotlinOptions {
        jvmTarget = "1.8"
     }
 }

2
работает шарм. спасибо
Дейв о Грейди

работает! спасибо
Вальдман

55

Когда другие решения не сработали для вас (измените версию JVM в настройках компилятора и добавьте jvmTargetв свойbuild.gradle ), из-за того, что ваши .imlфайлы пытаются принудительно настроить их конфигурации, вы можете изменить целевую платформу из настроек проекта.

  • открыто File > Project Structure
  • Перейти к Facets подProject Settings
    • Если он пуст, нажмите на маленький + кнопку
  • Нажмите на свой модуль / модули Kotlin
  • Изменение Target Platformк JVM 1.8(также лучше проверить Use project settingsвариант)

3
Я не могу найти этот раздел или раздел «facets» в Android Studio ... 🤔 Мне пришлось редактировать app.iml вручную. Я поставил <configuration version="3" platform="JVM 1.8" useProjectSettings="false">в trueи это сработало. Тем не менее, файл продолжает меняться обратно!
Aphex

1
@Aphex Это на самом деле в «Файл»> «Структура проекта», затем в «Настройках проекта»> «Фасеты», у меня там ничего не было, поэтому я нажал «+»> «Kotlin»> Выбрать свой проект. Это сделало это для меня :)
Николя Гийом

Это работает для меня, но меня заставляют вернуться к 1.6 каждый раз, когда я добавляю в свой файл build.gradle.kts.
Лу Морда

Есть ли способ настроить это и получить из файла Gradle? ИМХО это неправильная настройка является ошибкой в ​​intellij.
Жиль ван Гурп

36

В моем случае этот код не работал, пока я не перешел apply plugin: 'kotlin-android'снизу вверх.

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

kotlinOptions {jvmTarget = "1.8"} Диди трюк для меня, спасибо
Диди

32

В Android Studio 4.3.2 добавление через описанную ниже процедуру не работает.

  1. Откройте настройки IntelliJ
  2. Перейдите в раздел Сборка, выполнение, развертывание > Компилятор > Компилятор Kotlin НО Другие параметры> Котлин компилятор , если Android Studio> 3,4
  3. Измените версию Target JVM на 1.8
  4. Нажмите Применить

Причина в том, что Android studio не может добавить приведенный ниже код в файл Gradle уровня модуля. Пожалуйста, добавьте это вручную.

kotlinOptions {
    jvmTarget = "1.8"
}

Только для дополнения, ищите версию Target JVM в поиске студии android. Это приведет вас прямо к варианту. введите описание изображения здесь


только добавив вручную, у меня это сработало. По некоторым причинам, android studio действительно глючит и не учитывает внесенные изменения, пока мы не перезапустим ide, удалив весь кеш.
Каран Шарма


26

Февраль 2020
android 3.4+.
Выберите «Файл» -> «Настройки» -> «Компилятор Kotlin» -> «Целевая версия JVM»> «1.8», а затем обязательно выполните «Файл» -> «Синхронизировать проект с файлами Gradle».

Или добавьте это в build.gradle (модуль: приложение). в андроид блоке:

kotlinOptions {
           jvmTarget = "1.8"
         }

просто у меня работает "Синхронизация проекта с файлами Gradle" ..
Акаш Бисария

подтвердил, что вам нужно сделать проект File -> Sync с файлами Gradle, тогда он работает
Irfandi D. Vendy

19

Как написано в Using-Maven с сайта Kotlin:

Вы просто должны поместить <kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>в раздел свойств вашего pom.xml


19

Если у вас много наборов исходных кодов / модулей, может быть сложно настроить jvmTarget для каждого из них в отдельности.

Вы можете настроить jvmTarget для всех сразу:

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

Этот фрагмент можно использовать на верхнем уровне вашего файла gradle.build.

После изменения файла Gradle Reimport All Gradle Imports. Чтобы проверить, работает ли он, откройте Project Structureи убедитесь, что IntelliJ правильно назначен JVM 1.8всем модулям Kotlin. Это должно выглядеть так:

структура проекта

Я бы не рекомендовал менять платформу непосредственно в IntelliJ, потому что любой, кто клонирует ваш проект впервые, может столкнуться с той же проблемой. Его правильная настройка в Gradle имеет то преимущество, что IntelliJ будет вести себя правильно с самого начала.


16

В моем случае я решил это, выполнив следующие два шага

1. Go to android studio preferences -> other settings -> kotlin compiler -> set Target JVM version = 1.8 
   if it doesn't work then go to the second option.

2. In your module-level build.gradle file add 
   compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }
    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }

Эй, спасибо за ответ, я должен был сделать 2-й шаг, и он работает. Можете ли вы объяснить, зачем это нужно?
hushed_voice

Вы можете найти более подробную информацию об этом закрытом выпуске, это полезно знать [ github.com/mikepenz/Android-Iconics/issues/454]
Викас Шарма

Эта ссылка мертва
hushed_voice

12

Для меня причина была в том, что эта конфигурация в моей сборке была в некоторых модулях, а в некоторых - нет.

android {  
...      
kotlinOptions {
        val options = this as KotlinJvmOptions
        options.jvmTarget = "1.8"
    }
...
android {

1
Спасибо, это было единственное решение, которое сработало для меня. Я использую KTS Buiild файлы.
Крамс

Спасибо, это также решения, которые работали для меня. И так много декларативного. stackoverflow.com/a/57041765/3763032 Кевин также заявил, что из-за smartcast в файлах grad kotlin .kts он доступен напрямую
mochadwi

12

Для Gradle с языком Kotlin ( *.gradle.ktsфайлы), добавьте это:

android {
    [...]
    kotlinOptions {
        this as KotlinJvmOptions
        jvmTarget = "1.8"
    }
}

Почему мы должны бросить thisна KotlinJvmOptions. thisПриемник kotlinOptionsуже не в блоке KotlinJvmOptions? Тем не менее, это не работает для меня без актеров
11m0

1
@ 11m0, я думаю, что это связано с этой проблемой: github.com/gradle/kotlin-dsl-samples/issues/1368
HDW

Если KotlinJvmOptions не найден, попробуйте использовать полное имя «org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions».
HDW

4

в большинстве случаев этого достаточно:

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

если вы объявили пользовательские задачи Gradle, integrationTestнапример, добавьте конфигурацию для compile<YourTaskName>Kotlin:

compileIntegrationTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

это тоже будет работать, добавив в файл Gradle -> compileOptions {sourceCompatibility = 1.8 targetCompatibility = 1.8} kotlinOptions {jvmTarget = "1.8"}
Санкет Патель

Интересно, что только ваше решение работало с моим не Android-модулем! Спасибо!
Мухаммед Омидвар

4

Параметр sourceCompatibility = JavaVersion.VERSION_1_8разрешает отладку, но в настоящее время он не может отменить все функции Java 8, которые использует компилятор Kotlin.

введите описание изображения здесь

Исправлено - установка kotlinOptions.jvmTarget to JavaVersion.VERSION_1_8в модуле приложения Gradle устранит проблему.

Используйте функции языка Java 8: https://developer.android.com/studio/write/java8-support

android {
  ...
  // Configure only for each module that uses Java 8
  // language features (either in its source code or
  // through dependencies).
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "1.8"
  }
}

3

Все ответы здесь используют gradle, но если кто-то, как я, попадает сюда и нуждается в ответе для maven:

    <build>
        <sourceDirectory>src/main/kotlin</sourceDirectory>
        <testSourceDirectory>src/test/kotlin</testSourceDirectory>

        <plugins>
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>${kotlin.version}</version>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <jvmTarget>11</jvmTarget>
                </configuration>
            </plugin>
        </plugins>
    </build>

Изменение от архетипа jetbrains для kotlin-jvm - это <configuration></configuration>определение jvmTarget. В моем случае 11


3

У меня ничего не получалось, пока я не обновил свою зависимость от плагина kotlin.
Попробуйте это:
1. сделать недействительным cahce и перезапустить.
2. Синхронизировать проект (по крайней мере, попытаться).
3. Перейти в Файл -> Структура проекта -> Предложения.
4. Если есть обновление, касающееся Kotlin, обновите его.
Надеюсь, это кому-нибудь поможет.


самое простое исправление
u84six

2

Если вы используете Visual Studio Code ** с расширением Kotlin, перейдите в плагин управления Crtl + Shift + x, введите kotlin и нажмите на управление (маленькая шестеренка) >> Настройка параметров расширения

на Kotlin >> Компилятор >> Jvm: Target - введите версию Java. В моей ситуации просто набрал 1,8

А потом перезагрузите :-)

** vscode или просто «код» для Linux



2

Я использую Kotlin и Gradle для нормальной разработки JVM (не для Android), и это сработало для меня в build.gradle:

allprojects {
    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
        kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
    }
}

2

если вы находитесь в проекте Android

в build.gradle вашего приложения под Android {}

android{
//other configs...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

1

Если вы используете Eclipse, предполагая, что вы загрузили плагин Kotlin:

Щелкните правой кнопкой мыши по проекту -> Свойства -> Kotlin Compiler -> Включить конкретные настройки проекта -> Целевая версия JVM "1.8"


1

Для последних версий Android Studio, если изменение только версии Kotlin Target VM не сработало.

Файл Structure Структура проекта ➞ Модули ( app): установите «Совместимость источника» и «Совместимость цели» на «1,8 (Java 8)». Нажмите «ОК» и синхронизируйте проект с Gradle.


1

Использование Kotlin Gradle DSL решило эту проблему для меня. Я добавил это в build.gradle.kts. Это в дополнение к ответу Джоэла

val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString()

1
Можете ли вы поделиться, где именно в файле вы положили это? А какую версию плагина and gradle для Android вы используете?
деревья везде

Это не проект Android. Я бегу Gradle 6.4.
Бриантик

0

Еще один совет для пользователей Eclipse. После двойной проверки параметров цели jvm, указанных другими пользователями, у меня все еще была та же проблема, и она была вызвана отсутствием Kotlin Runtime Library. Например, при создании проекта с пружинным инициализатором, он не добавляется автоматически. Для добавления: right click on your project -> Build path -> Add libraries... -> User Libraryи просто добавьтеorg.jetbrains.kotlin.core.KOTLIN_CONTAINER

Убедитесь, что вы обновили свой проект gradle впоследствии ( right click -> Gradle -> Refresh gradle project)


0

Если вы сталкиваетесь с этим сообщением в проекте Spring Boot / Kotlin, просто установите для свойства "kotlin.compiler.jvmTarget" значение "1.8" в вашем файле pom.xml.

    <properties>
        <kotlin.version>1.3.70</kotlin.version>
        <kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
    </properties>
    ...

0

В моем случае jvmTarget уже был установлен в build.gradleфайле, как показано ниже.

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

Но моя проблема все еще была там. Наконец, это решается после изменения версии Target JVM с 1.6 на 1.8 в Предпочтения> Другие настройки> Kotlin Compiler> Версия Target JVM. см. прикрепленную картинку,

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.