无法将使用 JVM 目标 1.8 构建的字节码内联到使用 JVM 目标 1.6 构建的字节码中

Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6

尝试通过 IntelliJ 运行 Example CorDapp (GitHub CorDapp) 时,我收到以下错误:

Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6

如何修改 IntelliJ 设置,以便所有字节码都使用相同的 JVM 目标构建?

您可以按如下方式解决此问题:

  • 打开 IntelliJ 首选项
  • 转到 Build, Execution, Deployment > Compiler > Kotlin Compiler 但是 Other Settings > Kotlin compiler 如果 Android 工作室 > 3.4
  • Target JVM version 更改为 1.8
  • 点击Apply

Kotlin 网站的 using-maven 文档中写道:

您只需将 <kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget> 放入 pom.xml

的属性部分

你应该在 build.gradle

中配置如下内容
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

当其他解决方案对您不起作用时(更改编译器设置中的 JVM 版本并将 jvmTarget 添加到您的 build.gradle 中),因为您的 .iml 文件试图强制它们您可以从项目设置中更改目标平台的配置。

  • 打开File > Project Structure
  • 转到 Project Settings 下的 Facets
    • 如果它是空的然后点击小 + 按钮
  • 点击你的 Kotlin module/modules
  • Target Platform更改为JVM 1.8(最好勾选Use project settings选项)

如果您使用 Eclipse,假设您下载了 Kotlin 插件:

右键单击项目 -> 属性 -> Kotlin 编译器 -> 启用项目特定设置 -> JVM 目标版本“1.8”

对我来说,原因是我构建中的这个配置 gradle 在某些模块中存在,而在某些模块中则没有

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

app/build.gradle

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

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

GL

Use Java 8 language features

对于使用 Kotlin 语言的 Gradle(*.gradle.kts 个文件),添加:

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

在 Android Studio 4.3.2 中,通过以下过程添加不起作用。

  1. 打开 IntelliJ 首选项
  2. 转到 构建、执行、部署 > 编译器 > Kotlin 编译器 但其他设置> Kotlin 编译器 if Android Studio > 3.4
  3. 目标 JVM 版本更改为 1.8
  4. 点击应用

原因是,Android 工作室无法在模块级别 Gradle 文件中添加以下代码。请手动添加。

kotlinOptions {
    jvmTarget = "1.8"
}

仅针对插件,在 android 工作室搜索中搜索 目标 JVM 版本。它会直接带你到选项。

如果使用带有 Kotlin 扩展的 Visual Studio 代码**,请转到插件管理 Crtl + Shift + x,键入 kotlin 并单击管理(小齿轮)>> 配置扩展设置

在 Kotlin >> 编译器 >> Jvm:Target - 输入 java 版本。在我的情况下,只需输入 1.8

然后重启:-)

** vscode 或只是 'code' for linux

就我而言,我按照以下两个步骤解决了这个问题

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"
        }
    }

在我的例子中 文件 > 设置 > Kotlin 编译器 > 目标 JVM 版本 > 1.8

对于 Android Studio 的最新版本,如果仅更改 Kotlin 目标 VM 版本不起作用。

文件 ➞ 项目结构 ➞ 模块 (app):将 "Source Compatibility" 和 "Target Compatibility" 都设置为“1.8 (Java 8)”。按 "OK" 并与 Gradle 同步项目。

在我的例子中,像这样更改目标 JVM 版本:文件 > 设置 > Kotlin 编译器 > 目标 JVM 版本 > 1.8 没有帮助。但是,它确实解决了编译时错误。但是在运行时失败了。

我还必须在应用 build.gradle 文件中添加以下内容才能使其正常工作。

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

在大多数情况下这就足够了:

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

如果您已声明自定义 Gradle 任务,例如 integrationTest,请同时为 compile<YourTaskName>Kotlin 添加配置:

compileIntegrationTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

这里的所有答案都使用 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>

kotlin-jvm 的 jetbrains 原型的变化是 <configuration></configuration> 指定了 jvmTarget。在我的例子中 11

2020 年 2 月
android3.4+
转到 File -> Settings -> Kotlin Compiler -> Target JVM Version > set to 1.8 然后确保执行 File -> Sync project with Gradle files

或者将其添加到 build.gradle(module:app) 中的 android 块中:

kotlinOptions {
           jvmTarget = "1.8"
         }

设置sourceCompatibility = JavaVersion.VERSION_1_8启用脱糖,但目前无法脱除Kotlin编译器使用的所有Java 8个特性。

修复 - 在应用程序模块 Gradle 中设置 kotlinOptions.jvmTarget to JavaVersion.VERSION_1_8 可以解决问题。

Use Java 8 language features: 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"
  }
}

Eclipse 用户的另一个提示。仔细检查其他用户指出的 jvm 目标设置后,我仍然遇到同样的问题,这是由于缺少 Kotlin Runtime Library 造成的。例如,当使用 spring initializr 创建项目时,它不会自动添加。要添加它:right click on your project -> Build path -> Add libraries... -> User Library,只需添加 org.jetbrains.kotlin.core.KOTLIN_CONTAINER

确保之后刷新 gradle 项目 (right click -> Gradle -> Refresh gradle project)

在我的例子中,直到我将 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"
    }
}

在我更新我的 kotlin 插件依赖项之前,对我没有任何作用。
试试这个:
1.使cahce失效,重启
2.同步项目(至少尝试)
3. 转到文件 -> 项目结构 -> 建议
4.如果有关于Kotlin的更新,更新一下。
希望对大家有所帮助。

如果您有很多 sourcesets/modules ,分别为每个配置 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 从一开始就可以正确地为他们工作。

如果您在 Spring Boot/Kotlin 项目中遇到此消息,只需在 pom.xml 中将 属性 "kotlin.compiler.jvmTarget" 设置为“1.8” .

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

我正在使用 Kotlin 和 Gradle 进行正常的 JVM 开发,(不是 android)这对我有用 build.gradle:

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

如果您在 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"
    }
}

使用 Kotlin Gradle DSL,这解决了我的问题。我将其添加到 build.gradle.kts。 这是 Joel

回答的补充
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString()

在我的例子中,jvmTarget 已经在 build.gradle 文件中设置如下。

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

但我的问题仍然存在。 最后,在 Preferences > Other Settings > Kotlin Compiler > Target JVM version 中将 Target JVM version 从 1.6 更改为 1.8 后问题得到解决。见附图,

请将此代码添加到 app/build 内的 android 部分。gradle

compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8
    }

您可能需要同时设置 compileKotlincompileTestKotlin。 这适用于 gradle 6.5.1.

compileKotlin {
    kotlinOptions {
        languageVersion = "1.2"
        apiVersion = "1.2"
        jvmTarget = "1.8"
        javaParameters = true   // Useful for reflection.
    }
}

compileTestKotlin {
    kotlinOptions {
        languageVersion = "1.2"
        apiVersion = "1.2"
        jvmTarget = "1.8"
        javaParameters = true   // Useful for reflection.
    }
}

下一个解决方案帮助了我。添加到 build.gradle

 compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

这有助于构建我的项目,将其添加到模块 build.gradle 文件中:

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

如果以上答案均无效,您可以在 kotlin dsl 中执行此操作

android {
...

    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }
}

只需在 build.gradle 模块中添加此代码 kotlinOptions { jvmTarget = '1.8' }

我做了所有步骤但没有成功,问题是

implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'

当我更新到

implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.5.30'

当我返回时显示该问题

implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'

问题已解决

对我来说,它从 implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.5.30' 变为 implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'