警告: 类路径中的 Kotlin 运行时 JAR 文件应该有相同的版本

我得到了以下警告,但是我不确定 v1.0.6在哪里。

有没有可能这个错误来自 Kotlin 的某个图书馆,其中包括一个旧的科特林版本?

有没有什么办法可以解决这个问题,或者至少我可以按照这个建议让 kotlin 反映清楚(1.1) ?

enter image description here

170741 次浏览

似乎您的项目的配置方式依赖于 kotlin-stdlib1.1和 kotlin-reflect1.0。最有可能的情况是,您已经对 kotlin-stdlib1.1有明确的依赖关系,但是对 kotlin-reflect没有依赖关系,而其他一些库(您所依赖的库)依赖于 kotlin-reflect1.0。

如果确实如此,解决方案是提供对 kotlin-reflect1.1的显式依赖。

在 Maven 中,将下面的代码添加到 pom.xml:

    <dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>

在 Gradle,在美国广播公司商业广播公司(build.gradle)中加入以下内容:

dependencies {
implementation "org.jetbrains.kotlin:kotlin-reflect:1.1.0"
}

请参阅有关此信息和相关警告 在官方文件里

我通过覆盖我的应用程序中使用的 kotlin 版本来修正警告

configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'org.jetbrains.kotlin' && requested.name == 'kotlin-reflect') {
details.useVersion kotlin_version
}
}
}

例如 kotlin_version = 1.3.0

当你在 kotlin 项目(android)中使用匕首时会发生这种情况,你的 kotlin 版本是1.7

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

你所要做的就是将下面的依赖项添加到你的应用程序构建级别

  implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.50"

首先,通过下面的分级脚本找出原因

./gradlew app:dependencies

(将 app改为您的分级模块名称)

+--- project :common
|    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.61
|    |    +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.61
|    |    \--- org.jetbrains:annotations:13.0
|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.3
|    |    \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.61
|    +--- org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:0.12.0 -> 0.14.0
|    |    \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.60 -> 1.3.61

然后,将显示依赖关系树。 检查哪个依赖项使用问题依赖项。

如果找到了依赖项,就决定如何解决它。

  1. 升级依赖项的版本(依赖项的最新版本可能引用最新问题依赖项的版本)
  2. 或从依赖项中排除问题依赖项
  3. 或者追随其他答案。

我不知道什么是最好的方法,请参考一下。

确保使用相同版本的 stdlib-jdk7kotlin-gradle-plugin依赖项来避免警告。 < br/> 您可以参考下面的例子,其中 stdlib-jdk7kotlin-gradle-plugin都有相同的版本

App 级 build.gradle 文件

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.0"
...
}

项目级 build.gradle 文件

buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0"
...
}

}

换掉这个

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

implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.30'

库的版本应该与项目级的插件相同

 classpath org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.30

当 Lint 任务发生这种情况时,可以用以下方法列出依赖项:

./gradlew -q dependencies app:dependencies --configuration lintClassPath

这表明,例如 kotlin-stdlib-jdk8:1.4.32正在使用:

 +--- org.jetbrains.kotlin:kotlin-reflect:1.4.32 (*)
\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32 (*)

我已经写了一个 Gradle 脚本,它平衡了所有 Kotlin 图书馆的版本:

// Runtime JAR files in the classpath should have the same version.
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def kotlinVersion = "1.6.0"
def requested = details.requested
if (requested.group == 'org.jetbrains.kotlin') {
List<String> list = ['kotlin-stdlib', 'kotlin-stdlib-jdk7', 'kotlin-stdlib-jdk8', 'kotlin-stdlib-common']
if (list.contains(requested.name)) { details.useVersion kotlinVersion }
}
}
}

没有其他办法,因为一些旧版本正在被构建工具拉入。
还可以将 kotlin-reflect添加到 List<String> list中(未经测试)。

Gradle 中的 Kotlin 版本和与 IDE 绑定的版本是不同的。在 build.gradle (app)和 Tools-> Kotlin-> ConfigureKotlin Plugin Update 中检查 Kotlin 版本。

对于 flutter 初始化项目,我注释了这一行以引用已经可用的库

dependencies {
// implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

然后这个就不见了:

w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath


w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:

在你的项目中升级你自己版本的 Kotlin 会根据你所使用的依赖的版本来完成工作。

在把 Room 从2.3.0升级到2.4. x 之后,我把 kotlin 从1.5.21升级到1.6.0

对于我在我们的反应本机项目,我只需要添加 kotlinVersion = "1.6.10"android/build.gradle文件中的 buildscript.ext

// Top-level build file where you can add configuration options common to all sub-projects/modules.


buildscript {
ext {
buildToolsVersion = "30.0.2"
minSdkVersion = 23
compileSdkVersion = 31
targetSdkVersion = 31
ndkVersion = "21.4.7075529"
kotlinVersion = "1.6.10"
}
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:4.2.2")
classpath 'com.google.gms:google-services:4.3.10'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}


allprojects {
repositories {
jcenter()
mavenCentral()
mavenLocal()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url("$rootDir/../node_modules/react-native/android")
}
maven {
// Android JSC is installed from npm
url("$rootDir/../node_modules/jsc-android/dist")
}


google()
maven { url 'https://www.jitpack.io' }
}
}

使用 resolutionStrategy方法(参见@vlad 的答案 https://stackoverflow.com/a/53081554/430128)和 Gradle Kotlin DSL:

// this one defines it via rootProject e.g. `gradle.properties`
// change as needed
val kotlinVersion: String by rootProject


configurations.all {
resolutionStrategy {
force(
"org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}",
"org.jetbrains.kotlin:kotlin-stdlib-common:${kotlinVersion}",
"org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}",
)
}
}

将下面的代码添加到 android {//粘贴代码这里}中的 build.gradle 中 工作;

lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false
}