Android Gradle 插件 0.7.0:“APK 打包过程中出现重复文件”

Android Gradle plugin 0.7.0: "duplicate files during packaging of APK"

提问人:David Lawson 提问时间:12/19/2013 最后编辑:JonikDavid Lawson 更新时间:2/3/2019 访问量:126994

问:

使用 Android Gradle 插件 0.7.0 和以下功能:build.gradle

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.0'
    }
}

apply plugin: 'android'

repositories {
    maven { url "https://android-rome-feed-reader.googlecode.com/svn/maven2/releases" }
    maven { url "http://dl.bintray.com/populov/maven" }
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion '18.1.1'

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }
    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }
    productFlavors {
        defaultFlavor {
            proguardFile 'proguard-rules.txt'
        }
    }
    sourceSets {
        instrumentTest.setRoot('src/instrumentTest')
    }
}

configurations {
    apt
}

ext.androidAnnotationsVersion = '2.7.1';

dependencies {
    compile 'com.android.support:support-v4:18.0.0'

    compile 'com.viewpagerindicator:library:2.4.1@aar'

    compile 'com.google.code.android-rome-feed-reader:android-rome-feed-reader:1.0.0-r2'
    compile 'org.jdom:jdom:1.1.1-android-fork'

    apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}"
    compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}"

    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.j256.ormlite:ormlite-android:4.47'
    compile 'com.j256.ormlite:ormlite-core:4.47'
    compile 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
    compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
    compile 'com.prolificinteractive:actionbarsherlock:4.3.1@aar'

    compile 'com.google.code.geocoder-java:geocoder-java:0.15'

    compile files('libs/CWAC-Pager.jar')
}

android.applicationVariants.all { variant ->
    aptOutput = file("${project.buildDir}/source/apt_generated/${variant.dirName}")
    println "****************************"
    println "variant: ${variant.name}"
    println "manifest:  ${variant.processResources.manifestFile}"
    println "aptOutput:  ${aptOutput}"
    println "****************************"

    variant.javaCompile.doFirst {
        println "*** compile doFirst ${variant.name}"
        aptOutput.mkdirs()
        variant.javaCompile.options.compilerArgs += [
                '-processorpath', configurations.apt.getAsPath(),
                '-AandroidManifestFile=' + variant.processResources.manifestFile,
                '-s', aptOutput
        ]
    }
}

给出错误:Duplicate files copied in APK META-INF/LICENSE.txt

WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorDebug as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorRelease as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
Creating properties on demand (a.k.a. dynamic properties) has been deprecated and is scheduled to be removed in Gradle 2.0. Please read http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html for information on the replacement for dynamic properties.
Deprecated dynamic property: "aptOutput" on "com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@5705013c", value: "/Users/david/Developer...".
****************************
variant: defaultFlavorDebug
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/debug
****************************
Deprecated dynamic property "aptOutput" created in multiple locations.
****************************
variant: defaultFlavorRelease
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/release/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/release
****************************
:TravelGuard:compileDefaultFlavorDebugNdk UP-TO-DATE
:TravelGuard:preBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorDebugBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorReleaseBuild UP-TO-DATE
:TravelGuard:prepareComProlificinteractiveActionbarsherlock431Library UP-TO-DATE
:TravelGuard:prepareComViewpagerindicatorLibrary241Library UP-TO-DATE
:TravelGuard:prepareDefaultFlavorDebugDependencies
:TravelGuard:compileDefaultFlavorDebugAidl UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugRenderscript UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugBuildConfig UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugAssets UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugManifest UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugSources UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugJava
*** compile doFirst defaultFlavorDebug
/Users/david/Developer/.../src/main/java/com/travelguard/service/TravelGuardService.java:53: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.service.TravelGuardService
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:14: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:16: cannot find symbol
symbol  : class CategoryFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.CategoryFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:17: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:25: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:44: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.CountriesActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:18: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:19: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:21: cannot find symbol
symbol  : class InstructionsFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.InstructionsFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:36: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:40: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:41: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:55: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.MainActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:17: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:23: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.TermsActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
Note: Starting AndroidAnnotations annotation processing
Note: AndroidManifest.xml file found: /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
Note: Number of files generated by AndroidAnnotations: 22
Note: Generating source file: com.travelguard.service.SmartTravellerService_
Note: Generating source file: com.travelguard.service.SmartTravellerWebservice_
Note: Generating source file: com.travelguard.service.TravelGuardPrefs_
Note: Generating source file: com.travelguard.service.TravelGuardService_
Note: Generating source file: com.travelguard.service.TravelGuardWebservice_
Note: Generating source file: com.travelguard.ui.AdviceActivity_
Note: Generating source file: com.travelguard.ui.CategoriesActivity_
Note: Generating source file: com.travelguard.ui.ContactDetailActivity_
Note: Generating source file: com.travelguard.ui.ContactListActivity_
Note: Generating source file: com.travelguard.ui.ContactTravelGuardActivity_
Note: Generating source file: com.travelguard.ui.CountriesActivity_
Note: Generating source file: com.travelguard.ui.InformationActivity_
Note: Generating source file: com.travelguard.ui.InstructionsActivity_
Note: Generating source file: com.travelguard.ui.MainActivity_
Note: Generating source file: com.travelguard.ui.TermsActivity_
Note: Generating source file: com.travelguard.ui.TravelGuardActivity_
Note: Generating source file: com.travelguard.ui.fragments.AdviceDetailFragment_
Note: Generating source file: com.travelguard.ui.fragments.AdviceFragment_
Note: Generating source file: com.travelguard.ui.fragments.AssistanceFragment_
Note: Generating source file: com.travelguard.ui.fragments.CategoryFragment_
Note: Generating source file: com.travelguard.ui.fragments.ContactFragment_
Note: Generating source file: com.travelguard.ui.fragments.InstructionsFragment_
Note: Time measurements: [Whole Processing = 913 ms], [Generate Sources = 358 ms], [Extract Manifest = 163 ms], [Process Annotations = 158 ms], [Extract Annotations = 120 ms], [Validate Annotations = 82 ms], [Find R Classes = 28 ms],
Note: Time measurements: [Whole Processing = 0 ms],
Note: Time measurements: [Whole Processing = 0 ms],
warning: The following options were not recognized by any processor: '[androidManifestFile]'
Note: /Users/david/Developer/.../src/main/java/com/travelguard/ui/ContactDetailActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/david/Developer/.../src/main/java/com/travelguard/service/SmartTravellerService.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:TravelGuard:preDexDefaultFlavorDebug UP-TO-DATE
:TravelGuard:dexDefaultFlavorDebug
:TravelGuard:processDefaultFlavorDebugJavaRes UP-TO-DATE
:TravelGuard:validateDebugSigning
:TravelGuard:packageDefaultFlavorDebug
Error: duplicate files during packaging of APK /Users/david/Developer/.../build/apk/TravelGuard-defaultFlavor-debug-unaligned.apk
    Path in archive: META-INF/LICENSE.txt
    Origin 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    Origin 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.2/397f4731a9f9b6eb1907e224911c77ea3aa27a8b/commons-codec-1.2.jar
:TravelGuard:packageDefaultFlavorDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':TravelGuard:packageDefaultFlavorDebug'.
> Duplicate files copied in APK META-INF/LICENSE.txt
    File 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    File 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 21.957 secs

今天早上在我更新 Android Studio 之前一切正常。有什么想法吗?

编辑:我能够通过运行以下命令来暂时修复它

zip -d spring-android-core-1.0.1.RELEASE.jar META-INF/notice.txt

直到所有重复的错误都消失了。

Android Gradle android-studio android-gradle-插件

评论

0赞 Scott Barta 12/19/2013
另请参阅 stackoverflow.com/questions/20673888/...
2赞 Scott Barta 12/19/2013
这似乎是错误 code.google.com/p/android/issues/detail?id=61573。我不知道为什么在这个版本中它才开始给你带来麻烦。
0赞 mente 12/19/2013
陷入了同样的问题。决定继续使用 Android Studio 0.3.7 和 gradle 插件 0.6.3,直到错误得到解决
6赞 onigunn 12/19/2013
你应该清楚你的措辞:你没有使用 gradle 0.7.0 - 它是 android gradle 插件。它在 1.9.0 版中使用 gradle(带包装器)。错误的措辞会导致混淆 - 除了给定的上下文。
1赞 JJD 4/3/2014
请注意自 Gradle 0.9.1 起可用的选项。pickFirst

答:

475赞 Scott Barta 12/19/2013 #1

从 Android Studio 版本 0.8.14 开始

您应该添加:

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

添加到您的文件中。build.gradle

历史:

根据此错误中的评论 14: https://issuetracker.google.com/issues/36982149#comment14 这是 Android Gradle 插件 v0.7.0 中的一个错误,很快就会在 0.7.1 中修复。

以下是该错误中关于 0.7.1 添加的注释:

0.7.1 已解决此问题。

排除文件的 DSL 为:

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

您可以根据需要添加任意数量的 exclude 语句。该值是存档路径。尚不支持通配符或 glob。

文件名“LICENSE.txt”和“NOTICE.txt”区分大小写。请尝试使用“许可证.txt”和“通知.txt”。

评论

12赞 Climbatize 12/22/2013
谢谢!我还必须排除“META-INF/NOTICE.txt”;)
72赞 domenukk 1/2/2014
日复一日,我惊讶于程序员在stackoverflow到来之前如何能够远程生产。感谢您的修复!我不得不排除 META-INF/LICENSE 和 /NOTICE。(没有 txt,即使在最新的 gradle 上也是如此。
3赞 eyal 3/30/2014
我应该编辑什么文件,在哪里可以找到它?谢谢,埃亚尔。
2赞 praneetloke 4/4/2014
@um.anusorn Sean 为您提供了一个很好的 gradle 文件示例,该文件在打包过程中从库中排除了这些文件。这就是我所拥有的: packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/license.txt' exclude 'META-INF/dependenices.txt' exclude 'META-INF/notice.txt' }
4赞 Nilzor 8/7/2014
构建工具的 v0.12 中仍然普遍存在的错误。只是说
2赞 Patrick 12/19/2013 #2

问题是 META-INF 文件夹不会被过滤,因此在构建时会有多个条目或导致重复,并尝试将它们复制在一起。NOTICELICENSE

肮脏的快速修复:

打开文件夹中的文件(使用 zip 兼容工具),然后删除或重命名文件夹中导致错误的文件(通常或 )。(我知道这也在 OP 中,但对我来说,直到我阅读谷歌论坛才真正清楚).jar.gradle/caches/...META-INFNOTICELICENSE

编辑:

此问题已在 0.7.1 中修复。只需添加要排除的 confilcting 文件即可。

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

评论

0赞 UmAnusorn 4/3/2014
哦,对不起,我现在才明白。
0赞 Riduidel 6/28/2017
也许最糟糕的答案是:更改 gradle 缓存中的 jar 可能会更改它们的校验和,因此不会长时间工作......此外,那些不是你的罐子
0赞 Patrick 6/28/2017
是的,这就是为什么它用粗体字母写着“Dirty Quick Fix”。此外,正确的解决方案也只是一个段落。你确实意识到这是在没有干净解决方案的时候编写的,但人们仍然需要编译他们的应用程序。
2赞 Maxime 12/20/2013 #3

我在 AOSP 中注意到了这个提交注释,解决方案是使用 DSL 排除一些文件。大概在 0.7.1 发布时。

commit e7669b24c1f23ba457fdee614ef7161b33feee69
Author: Xavier Ducrohet <--->
Date:   Thu Dec 19 10:21:04 2013 -0800

    Add DSL to exclude some files from packaging.

    This only applies to files coming from jar dependencies.
    The DSL is:

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

评论

0赞 Matt Wolfe 12/20/2013
是的,他们刚刚在构建网站上写了发行说明,所以希望他们能尽快将工件上传到 Maven Central,以便我们可以使用它!
0赞 mirabilos 9/9/2020
如果我不想排除它们,只需重命名它们以免它们发生冲突怎么办?
46赞 user3121011 12/20/2013 #4
packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
}

评论

4赞 theblang 2/19/2014
我需要后缀。.txt
1赞 theblang 10/3/2014
我正在做的其他事情只是把我带回了这里,我不需要后缀。所以我猜 YMMV(或 MMMV,具体取决于一年中的时间)。.txt
149赞 vincentjames501 1/8/2014 #5

就我而言,我必须包括几个额外的排除项。它似乎不喜欢正则表达式,这将使它成为一个不错的单行。

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/notice.txt'
    }
}

评论

0赞 theblang 2/19/2014
我只需要,在我添加之后.LICENSENOTICEcommons-lang3
0赞 javaxian 5/15/2014
这个帮助了我(我有AndroidAnnotations + Spring REST模板)。由于不得不添加这样的黑客,这个 IntelliJ 产品可怕地开始类似于 Eclipse......
0赞 CopperCash 7/4/2014
不知道哪个会影响,但这真的很有帮助。
0赞 VVB 2/8/2016
对我不起作用,仍然显示 Warning:Dependency org.apache.httpcomponents:httpclient:4.3 被忽略以进行调试,因为它可能与 Android 提供的内部版本冲突。如果出现问题,请用 jarjar 重新打包以更改类包
8赞 Ryan Heitner 2/2/2014 #6

这个错误在 0.8+/1.10 中仍然存在

与杰克逊

compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.2.2'

在编译之前,我必须包括上述建议

exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'

评论

0赞 UmAnusorn 4/3/2014
如何排除“META-INF/services/com.fasterxml.jackson.core.JsonFactory”。我应该编辑哪个文件?
31赞 JJD 6/15/2014 #7

看看 Sakiboy 的评论


过时的答案

从 Gradle 0.9.1 开始,支持以下内容:

android.packagingOptions {
    pickFirst 'META-INF/LICENSE.txt'
}

如需了解详情,请参阅 Gradle 版本说明

评论

3赞 Louth 10/31/2014
这是一个更好的解决方案,因为开发人员在使用开源软件时有义务包含这些文件。
1赞 Igor Čordaš 4/1/2015
不错的选择,但这个评论是完全错误的。仅包括 firs 库的许可证,其余部分将被排除在外。
1赞 Fabian 1/27/2016
如果 2 个库使用相同的 .so 文件,这将非常有用
0赞 WillC 4/18/2017
我可以将其用于包含相同 .class 文件的两个 JAR 吗?我包含两个 JAR,它们都包含 org/xmlpull/v1/XmlPullParser.class
2赞 Sakiboy 12/15/2017
@PSIXO,如果您想包含所有许可证,您可以在下面看到答案: stackoverflow.com/a/47828425/2371425
12赞 ferdiado 8/26/2014 #8

在Android Studio 0.8.6中导出库httclient-4.3.5时也遇到同样的问题 我需要包括这个:

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

库 zip 内容下一个 jar:

commons-codec-1.6.jar
commons-logging-1.1.3.jar
fluent-hc-4.3.5.jar
httpclient-4.3.5.jar
httpclient-cache-4.3.5.jar
httpcore-4.3.2.jar
httpmime-4.3.5.jar
2赞 Alexander Logvinenko 9/11/2014 #9

重要的是要知道在哪个文件中出现此错误(在您的示例中是 META-INF/LICENSE.txt),就我而言,它是在 META-INF/LICENSE [没有“.txt”]中,然后在文件 META-INF/ASL2.0 中,所以我在我的 build.gradle 中添加了以下行:

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/ASL2.0'
    }
}

非常重要 (!) -> 以相同的样式添加文件的名称,您在错误消息中看到它:文本区分大小写,并且 *.txt 和 *(没有“txt”)之间存在差异。

1赞 K. Stopa 9/21/2014 #10

就我而言,我只需要添加到项目的build.gradle文件中:

android {
  packagingOptions {
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
  }

   ...
}
4赞 saneryee 12/16/2014 #11

当我在Android Studio 1.0.1中使用“ org.springframework.android:spring-android-rest-template:2.0.0.M1”时,也遇到了同样的问题。我需要把它包含在build.gradle

android{
...
    packagingOptions{
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
...
}
2赞 clément francomme 12/23/2014 #12

同样在这里

dependencies {
    compile 'org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.0'
}

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

我因为这个奇怪的错误损失了 2 天......为什么这在gradle 1.0.0中仍然发生?这对新手来说非常令人不安...... 无论如何,感谢您的信息,我认为它在我的代码:)

0赞 kandroidj 3/8/2015 #13

在Android Studio 1.1.0中,我需要小写名称:

packagingOptions{
      exclude 'META-INF/license.txt'
      exclude 'META-INF/notice.txt'
}
6赞 Pian0_M4n 5/2/2015 #14

不止一个错误

apply plugin: 'android-library'

添加这个 ::

android {
    packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
}

如果文件重复,这很容易,请查看目录下方并查看导致错误的原因。它可以是多个。就我而言,Couchbase Lite插件。 当您添加更多插件时,您将需要更多的例外JARMETA-INF

评论

0赞 WillC 4/18/2017
愚蠢的问题:JAR文件在哪里?
0赞 WillC 4/19/2017
在 Android Studio 中,运行带有该标志的 Gradle 可以让我看到添加到 apk 的类的日志,然后我可以向上搜索以查找从不同 JAR 添加的相同类的日志条目。这也向我展示了两个JAR文件的文件路径。我找不到选择一个 .class 文件而不是另一个文件的好方法,所以我修改了其中一个 JAR 文件并删除了重复的 .class--info
3赞 Sestertius 6/7/2015 #15

这对我有用:

android {
   packagingOptions {
       exclude 'LICENSE.txt'
   }
}
3赞 Gent 2/25/2016 #16

我认为您只需要在build.gradle中包含以下选项:

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

p.s 与我的帖子中的答案相同: 错误 :: APK 打包期间重复文件

0赞 Igor Vuković 8/23/2016 #17

文件“LICENSE.txt”和“NOTICE.txt”区分大小写。因此,对于 SPring android 库,我必须添加

android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/notice.txt'
    }
}
0赞 JSONParser 12/11/2016 #18

在许可证删除我的错误后删除.txt:

packagingOptions {
    exclude 'META-INF/LICENSE'
}
0赞 alias26 3/27/2017 #19
  packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/LGPL2.1'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/notice.txt'
}
3赞 Sakiboy 12/15/2017 #20

如果你想尽自己的一份力量,利用开源库,你应该尝试将所有这些开源许可证包含在你的 .为此,您可以在 .apkpackagingOptions

例:

packagingOptions {
        // This will get include every license and notice regardless of what dir it’s in.
        merge '**/LICENSE.txt'
        merge '**/NOTICE.txt'
        merge '**/notice.txt'
        merge '**/license.txt'
        merge '**/NOTICE'
        merge '**/LICENSE'
        merge '**/notice'
        merge '**/license'
        merge '**/LGPL2.1'
        // This will exclude any README files, regardless of the dir or the file type.
        exclude '**/README.*'
}

这个答案比使用要好,因为该方法选择它找到的第一个许可证,而忽略所有其他许可证,在这种情况下有点使它变得无用。pickFirst

因此,简而言之,使用该方法包含您一直在使用的那些 kickass 开源库中的所有许可证。merge

有关 PackagingOptions 的详细信息。Gradle