ChatGPT解决这个技术问题 Extra ChatGPT

发现多个文件具有独立于操作系统的路径“META-INF/LICENSE”

当我构建我的应用程序时,我收到以下错误:

错误:任务“:app:transformResourcesWithMergeJavaResForDebug”执行失败。发现多个文件具有独立于操作系统的路径“META-INF/LICENSE”

这是我的 build.gradle 文件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "cn.sz.cyrus.kotlintest"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        javaCompileOptions{
            annotationProcessorOptions{
                includeCompileClasspath = true
            }
        }
        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
 /*       exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'*/
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
    compile 'com.github.GrenderG:Toasty:1.2.5'
    compile 'com.orhanobut:logger:1.15'

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.umeng.analytics:analytics:latest.integration'
    compile 'ai.api:libai:1.4.8'
    compile 'ai.api:sdk:2.0.5@aar'
// api.ai SDK dependencies
    compile 'com.google.code.gson:gson:2.8.0'
    compile 'commons-io:commons-io:2.4'
    compile 'com.android.support:multidex:1.0.1'
}

当我将此代码添加到我的 build.gradle 文件时,

  packagingOptions {
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
        }

这个错误会解决,但会发生另一个问题。像这样:

java.lang.NoClassDefFoundError: com.squareup.leakcanary.internal.HeapAnalyzerService
at com.squareup.leakcanary.LeakCanary.isInAnalyzerProcess(LeakCanary.java:145)
at cn.sz.cyrus.wemz.TestApplication.onCreate(TestApplication.kt:32)

谁有想法如何解决这个问题?

在访问适用于 Android 的 Google API 客户端库时,我遇到了同样的问题。通过从 gradle 依赖项中排除模块 HttpClient 解决了该问题。有关更多详细信息,请参阅 Google 文档developers.google.com/api-client-library/java/…在文档页面中搜索“在 Android 上,您需要明确排除未使用的依赖项:”
尝试在您的 build.gradle android 中更改最低 Android 版本 >= 21{}

J
JohnnyLambada

您可以在 android{} 内的 yourProject/app/build.gradle 中添加它。 exclude 函数将命名资源添加到未打包在 APK 中的资源列表中。

android {      
      packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude("META-INF/*.kotlin_module") 
      }          
}

exclude 函数在 7.0.2 中已弃用,您应该使用与此类似的内容:

android {
   ...
   packagingOptions {
       resources.excludes.add("META-INF/*")
   }
}

您能否解释一下为什么会这样以及“META-INF”的含义是什么?谢谢!
@CodeSlave 如果我们没有从 google.github.io/android-gradle-dsl/current/… 中排除这些文件,则会导致 apk 出现一些问题。匹配排除模式的排除路径将不会包含在 APK 中。这就是我所知道的。我对这个问题还没有完全了解
虽然这可能会回答问题,但最好添加一些关于此答案如何有助于解决问题的描述。请阅读 How do I write a good answer 了解更多信息。
就我而言,我还需要添加“META-INF/LICENSE.md”和“META-INF/LICENSE-notice.md”
在 packaginOptions 列表中添加 exclude("META-INF/*.kotlin_module")
A
Alessandro Ornano

就我而言,仅在 android{} 内的 yourProject/app/build.gradle 上排除路径 'META-INF/DEPENDENCIES' 就足够了。这里是

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
}

然后做清洁项目和重建项目。


@SilSur 排除该文件,因此您在我的代码中出现错误,就像“META-INF/proguard/androidx-annotations.pro”这个文件一样,然后我添加了 exclude 'META-INF/proguard/androidx-annotations。 pro' 及其工作。
您无需清理只需同步 gradle 文件
谢谢!当我将 exclude 'DebugProbesKt.bin' 添加到 packagingOptions 时有所帮助。
那么为什么它首先会发生呢?
k
koen

这里的解决方案对我没有帮助,但 this link 对我有帮助。

如果您的库添加了一些 android .so 文件(例如 libassmidi.solibgnustl_shared.so),您必须告诉 gradle 在打包时只选择一个,否则会发生冲突。

android {
  packagingOptions {
    pickFirst 'lib/armeabi-v7a/libassmidi.so'
    pickFirst 'lib/x86/libassmidi.so'
  }
}

在将 React Native 应用程序用作 Android 项目中的库时,我遇到了这个问题。希望能帮助到你


谢谢,我只有一个 .so 文件有同样的问题。在同一个文件夹中还有另一个名为 gdbserver 的文件,在为库添加了 packagingOptions 之后,它现在可以工作了。
谢谢!当我将 JNA aar 作为嵌套依赖项时有所帮助
谢谢!就我而言,我添加了这样的行 pickFirst "**/libarcore_sdk_c.so",效果很好
K
Karthick Meenakshi Sundaram

基本上,当 gradle 将 apk 文件放在一起时,它会从所有编译依赖项中复制内容,它足够聪明地看到有一个重复的文件..来自两个不同的 jar 文件。这可以是任何文件,例如 a.txt 或 META-INF/DEPENDENCIES。最好使用以下内容排除这些文件,以防该文件仅用于提供信息。

android{
    packagingOptions {
       exclude 'META-INF/DEPENDENCIES'
    }
}

或者,如果该文件是类文件之类的强制文件,并且已在两个彼此相关的 jar 依赖项中重复,则最好以更兼容的版本的方式找到这些 jar 的替代品。


当我将此添加到我的项目中时,我得到另一个错误,我再次无法解决!还有其他解决方案吗?
就我而言,这种依赖关系导致了问题: implementation 'com.google.apis:google-api-services-people:v1-rev20210120-1.31.0'
F
Fred B.

我在多模块应用程序环境中遇到了类似的问题:

错误:任务“:app:transformResourcesWithMergeJavaResForDebug”执行失败。发现多个文件具有独立于操作系统的路径“META-INF/AL2.0”

我的几个模块报告了这个问题,上述解决方案都没有解决它。原来,我使用的是 Coroutines 1.3.6 版本,它似乎嵌入了 META-INF/AL2.0,而我正在使用的另一个库已经嵌入了 META-INF/AL2.0。为了解决这个问题,我在失败的模块的 build.gradle 中添加了以下代码片段:

configurations.all {
    resolutionStrategy {
        exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug"

    }
}

鉴于它发生在多个模块上,我已将该 resolutionStrategy 代码移至我的项目级 build.gradle。之后一切正常。


+ 用于解释,这有助于我诊断我面临的问题
P
Pieter

有类似的消息

错误:任务':app:transformResourcesWithMergeJavaResForDebug'的执行失败。找到多个文件,其独立于操作系统的路径为“constant-values.html”

为了解决这个问题,我必须在 Android Studio 中启用包视图(1),然后通过树浏览到库,并找到重复项(2)

然后,ctrl+alt+f12(或 RMB 菜单)(3) - 找到导致问题的库。列出了导致问题的那些库中的文件,并将它们写入应用程序的 build.gradle 文件中的 android 部分。其他选项是处理包含重复文件的库

packagingOptions {
    exclude 'allclasses-frame.html'
    exclude 'allclasses-noframe.html'
    <..>

https://i.stack.imgur.com/go5VH.png


您如何“然后通过树浏览到库,并找到重复项”?你真的检查了所有文件夹中的所有文件吗?
我也对“找到重复项”感到困惑。应用程序/库中可能有 100 个子条目......如何定位重复项?
就我而言,我必须在路径中添加一个通配符才能排除子文件夹中的文件。例如“**/file_to_exclude.dll”。我还使用“folder_content_to_exclude/**”排除了一个文件夹及其子项
T
Trake Vital

排除所有仅用于文档和信息目的的元信息文件是完全安全的:

android{
    packagingOptions {
       exclude 'META-INF/*'
    }
}

来源:https://stackoverflow.com/a/49101232/13093413


T
Thermech

在 android{} 内的应用级 gradle 文件中添加以下内容

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/ASL2.0'
    exclude("META-INF/*.kotlin_module") 
} 

     

V
Vairavan

使用时会出现这种情况

org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.0

并在下一个版本中修复

org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1


org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6 的类似问题,这是目前最新的。不得不降级
是的,1.3.6 上的同样问题
我不得不将 org.jetbrains.kotlinx:kotlinx-coroutines-test 从 1.3.9 降级到 1.2.1
M
Mohsen

我遇到了同样的问题,我试过这个

错误:发现多个文件具有独立于操作系统的路径“META-INF/proguard/androidx-annotations.pro”

解决方案:解决此问题所需要做的就是将其添加到应用程序“build.gradle”中的 android { } 部分

packagingOptions {
    exclude 'META-INF/proguard/androidx-annotations.pro'
}

O
Owen Chen

我遇到了同样的错误,我发现它是由不同的模块包含来自不同包的相同类引起的。

例如,一个使用 androidx 包,另一个使用 pre-androidx

我通过使用 Android Studio 的内置功能将 pre-androidx 模块迁移到 androidx 解决了这个问题:“重构 --> 迁移到 Androidx ...”而不排除任何内容。

对于您的情况,您可以检查模块之间是否存在任何依赖项不匹配。


不要忘记备份您项目的当前版本,因为迁移到 AndroidX 可能会破坏您的项目!
J
Jorgesys

我已阅读与在 Android Studio 中获取此消息相关的所有答案:

发现多个文件具有独立于操作系统的路径“META-INF/LICENSE”

但是在这种情况下不需要排除类,我们只需要排除 'META-INF/DEPENDENCIES',这可以在 /app/build.gradle 内完成:

android{
    ...
    ...
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }

}

在关于 SO 的数百个其他答案中也有同样的说法
S
Sandeep Yohans

我是我的应用程序,我正在添加这样的 jar 依赖项:

implementation files('libs/json-simple-1.1.1.jar')

但我意识到它们已经被添加,因为依赖项中的以下第一行:

implementation fileTree(include: ['*.jar'], dir: 'libs')

这一行将 lib 文件夹中的所有 jars 添加到应用程序依赖项中。

因此,在移除额外的依赖项 implementation files('libs/json-simple-1.1.1.jar')

它工作正常。


这很有帮助,但与答案无关。在库中,您可以找到名称和格式相似的文件元文件夹 META-INF。这些导致重复文件问题,因此必须删除。
j
juzraai

我将 Studio 从 Java 7 更新到 Java 8,出现了这个问题。然后我以这种方式解决了它:

android {
    defaultConfig {
    }
    buildTypes {
    }
    packagingOptions{
        exclude 'META-INF/rxjava.properties'
    }
}

Y
Yogendra

对于 Gradle 7.2 及更高版本添加应用内 Gradle 文件

android {
  
   packagingOptions {
       resources.excludes.add("META-INF/*")
   }


}

S
Sam

这对我有用

packagingOptions {
   exclude 'META-INF/*'
}

简单的解决方案,但这花了我 3 个小时
在我的情况下,该应用程序运行良好,直到我添加了 Firebase Cloud Messaging。这个答案帮助了我。不过花了我2小时。谢谢
F
Fayaz

基于@JohnnyLambada 和@Shaaban Ebrahim 提供的答案

为了排除嵌套文件,我使用了以下内容。

    packagingOptions {
        resources.excludes.add("META-INF/**/*")
    }

PS:不是用相同的答案发送垃圾邮件,而是如果您收到类似错误的建议

4 files found with path 'META-INF/gradle/incremental.annotation.processors'.

它从嵌套目录中捕获错误,仅供参考我使用 kotlin-dsl 设置了我的依赖项


P
Parag Jain

添加

android.useAndroidX=true

android.enableJetifier=true

到 gradle.properties 为我工作。


A
AaronC

由于尚未提及,您也可以合并文件以符合许可证要求(或仅使用 Daniel Reina 所述的 pickFirst)。

packagingOptions {
    merge "META-INF/LICENSE"
    merge "META-INF/AL2.0"
    merge "META-INF/LGPL2.1"
}

参考:Gradle API 4.2 Packaging Options


我猜 mergeexcludepickFirst 函数更“合法”。
V
Vi012

我有一个类似的问题。我收到错误消息-

Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.

More than one file was found with OS independent path 'javax/annotation/WillCloseWhenClosed.java'

如上面的一些答案所述,使用以下代码有效

'packagingOptions {
       exclude 'allclasses-frame.html'
    }'

但是我在 20 个不同的文件中遇到了这个错误,所以在排除了 20 个文件之后,我停下来试图找到一个不错的解决方案。我也遇到过

'Unable to execute dex: Multiple dex files' error.

我终于设法解决了这个问题。

首先(在我的情况下,WillCloseWhenClosed.java 是重复文件),在 android studio 中,您可以选择“到处搜索”。在那里写入并搜索文件。在那里我找到了这个文件的多个实例。因此,我单击了这两个实例并通过右键单击文件并在它们在 android studio 中打开时查看其位置来查看它们的位置。

其次,我发现我在 gradle 文件中有一些依赖项。我正在使用下面的代码

dependencies {
    compile 'com.google.api-client:google-api-client:1.23.0'
}

而且我在以下位置有他们相同的 zip 包:\Users\user\AndroidStudioProjects\git\appname\app\libs\google-http-client-1.23!。

所以这是多余的,这就是 gradle 找到 2 个文件的原因。所以我删除了我的 zip 包,它为我解决了错误。这样做时要小心。您必须找出要删除的正确文件或包。

第三,gradle 还在这个位置(至少对我来说是这样)压缩了这些 bug 文件 - C:\Program Files\Android\Android Studio\gradle\m2repository\com\google\code\findbugs\jsr305\1.3。 9\jsr305-1.3.9.jar!

所以我也从这里删除了 jsr305-1.3.9.jar 文件。

如果您仍然感到困惑,只需在 android studio 中“到处搜索”,在那里找到您的文件实例,然后您将不得不删除其中一个。花点时间弄清楚是哪一个。


C
Community

我有同样的问题,我试过这个

错误:发现多个文件具有独立于操作系统的路径 'META-INF/library_release.kotlin_module'

解决方案:

android {
    packagingOptions {
    exclude 'META-INF/library_release.kotlin_module'
    }
}

M
M.ghorbani

此错误是由添加支持库而不是 AndroidX 引起的。确保使用哪一个:

对于 AndroidX:

dependencies {
    def multidex_version = "2.0.1"
    implementation 'androidx.multidex:multidex:$multidex_version'
}

如果您不使用 AndroidX:

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

同样在清单中使用应用程序类名称而不是应用程序标记中的“android.support.multidex.MultiDexApplication”(我的应用程序类名称是 G):

错误:

<application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
</application>

正确的:

<application
            android:name=".G" >
        ...
</application>

N
Nadeem Iqbal

把它放在 build.gradle (Module AppName)

android {
   // ....
   packagingOptions{
     pickFirst "androidsupportmultidexversion.txt"
  }
}

M
M.Ed

为我工作。将这些添加到您应用的 build.gradle 中的 android{} 块中。

packagingOptions {
    exclude 'META-INF/AL2.0'
    exclude 'META-INF/LGPL2.1'
}

b
ben_joseph

我遇到了这个问题,首先是一些本机库(.so 文件),然后是 java/kotlin 文件。结果我从源代码中包含了一个库,并通过传递依赖项引用了工件。检查您的依赖关系树以查看是否有任何冗余条目。使用 ./gradlew :app:dependencies 获取依赖关系树。如果主模块名称不同,请将“app”替换为您的模块名称。


H
Harsh Mittal

尝试从默认配置中删除 multidex 并检查构建错误日志。如果该日志与 INotification 类相关。在 android 中使用它{}

configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}

这对我有帮助。


S
Sana Ebadi

在 gradle 7.2 及更高版本中,您可以解决如下问题:

android 块中的 app/build.gradle 中:

  packagingOptions {
        resources.excludes.add("META-INF/notice.txt")
        resources.merges.add("META-INF/LICENSE")
        resources.merges.add("META-INF/AL2.0")
        resources.merges.add("META-INF/LGPL2.1")
    }

A
Atul

在关于这个问题的许多 SO 答案中,建议添加 exclude 'META-INF/DEPENDENCIES' 和其他一些排除项。然而,这些都不适合我。在我的情况下,情况是这样的:

我在依赖项中添加了这个:

implementation 'androidx.annotation:annotation:1.1.0'

我还在 gradle.properties 中添加了这个:

android.useAndroidX=true

这两个我都添加了,因为我遇到了构建错误“找不到符号类 Nullable”,并且在 here 等一些答案中建议将其作为解决方案

但是,最终我遇到了错误:

 More than one file was found with OS independent path 'androidsupportmultidexversion.txt'

没有 exclude 对我有用。最后,我只是出于怀疑而删除了上面添加的行(以某种替代方式解决了“找不到符号类 Nullable”),最后我摆脱了这个“在操作系统中发现了多个文件......”构建错误。我浪费了我的时间。但最终摆脱了它。


R
Raksha Saini

如果您遇到此问题并且您有 gradle .jar dependency,如下所示:

implementation group: 'org.mortbay.jetty', name: 'jetty', version: '6.1.26'

间隔版本,直到一个匹配并解决异常,并应用此线程的最佳答案。`


E
Enes Zor

如果您使用多模块项目并在 espresso 测试时遇到此问题,则需要在每个 gradle 文件中添加 PackagingOptions 代码。就我而言,我为每个 gradle 文件添加了以下代码。

packagingOptions {
    exclude 'META-INF/lib_release.kotlin_module'
}

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅