Lỗi nhập lớp trùng lặp: META-INF / MANIFEST.MF (Hoặc cách xóa tệp khỏi tệp jar)


19

Tôi đã nhân bản một kho lưu trữ github vì tôi muốn nghiên cứu mã, nhưng khi tôi cố gắng xây dựng nó trong Android Studio, tôi đã gặp một số rắc rối. Sau khi thêm kho lưu trữ google maven (như được nhắc bởi Android Studio) và cập nhật cả Phiên bản Plugin Gradle và Phiên bản lớp (tương ứng với 3.5.2 và 5.4.1), quá trình xây dựng không thành công do lỗi sau:

Nguyên nhân: mục nhập trùng lặp: META-INF / MANIFEST.MF

Và điều này, để cụ thể hơn:

Nguyên nhân do: java.util.zip.ZipException: mục trùng lặp: META-INF / MANIFEST.MF

Đây là tập tin build.gradle cấp dự án của tôi:


    buildscript {
        repositories {
            jcenter()
            google()
        }

        dependencies {
            classpath 'com.android.tools.build:gradle:3.5.2'

            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }

    allprojects {
        repositories {
            jcenter()

            maven {
                url 'https://maven.google.com'
            }

        }
    }

Đây là tập tin build.gradle mô-đun của tôi (trước khi thử bất cứ điều gì):


    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 22
        buildToolsVersion '28.0.3'

        defaultConfig {
            applicationId "com.thelittlenaruto.supportdesignexample"
            minSdkVersion 11
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation ('com.android.support:appcompat-v7:22.2.1')
        implementation ('com.android.support:design:22.2.1')
        implementation 'com.github.frankiesardo:linearlistview:1.0.1@aar'
    }

Đây là những gì tôi đã thử cho đến nay:

  • Thêm phần sau vào phần android của tệp build.gradle mô-đun của tôi:

    sourceSets {
            main{
                java{
                    exclude '**/META-INF/MANIFEST'
                    exclude '**/META-INF/MANIFEST.MF'
                    exclude 'META-INF/MANIFEST'
                    exclude 'META-INF/MANIFEST.MF'
                    exclude '!META-INF/MANIFEST.MF'
                }
            }
        }
  • Thêm điều này:

    sourceSets.main.res.filter.exclude 'META-INF/MANIFEST'
        sourceSets.main.res.filter.exclude 'META-INF/MANIFEST.MF'
  • Ngoài ra này:

    packagingOptions {
            apply plugin: 'project-report'
            exclude '**/META-INF/MANIFEST'
            exclude '**/META-INF/MANIFEST.MF'
            exclude 'META-INF/MANIFEST'
            exclude 'META-INF/MANIFEST.MF'
            exclude '!META-INF/MANIFEST.MF'
        }
  • Và điều này:

    packagingOptions {
            pickFirst '**/META-INF/MANIFEST'
            pickFirst '**/META-INF/MANIFEST.MF'
            pickFirst 'META-INF/MANIFEST'
            pickFirst 'META-INF/MANIFEST.MF'
            pickFirst '!META-INF/MANIFEST.MF'
        }
  • Điều này:

    aaptOptions {
            ignoreAssetsPattern "!META-INF/MANIFEST.MF"
            ignoreAssetsPattern "META-INF/MANIFEST.MF"
        }

Tôi nghĩ rằng tôi đã thử hầu hết mọi thứ trong câu hỏi này: Làm cách nào để loại trừ một số tệp nhất định khỏi các bản dựng lớp của Android Studio?

Không có gì làm việc.

Sau khi tìm kiếm một giải pháp, tôi nghĩ vấn đề là tôi đã bị trùng lặp phụ thuộc. Vì vậy, tôi đã thử như sau:


    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation ('com.android.support:appcompat-v7:22.2.1'){
            exclude module: 'support-v4'
        }
        implementation ('com.android.support:design:22.2.1')
        implementation 'com.github.frankiesardo:linearlistview:1.0.1@aar'
    }

Và điều này:


    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation ('com.android.support:design:22.2.1'){
            exclude module: 'support-v7'
        }
        implementation 'com.github.frankiesardo:linearlistview:1.0.1@aar'
    }

Tôi vẫn nhận được lỗi tương tự.

Bất cứ ai có thể xin vui lòng cho tôi biết những gì tôi đang làm sai? Cảm ơn bạn trong dự đoán. :)


Tôi có cùng một vấn đề ở đây với ứng dụng Roboyard của tôi trên GitHub: stackoverflow.com/q/59130438/1069083 Có lẽ bạn tìm thấy sự tương đồng ở đó
rubo77

Câu trả lời:


22

Như Rajen Raiyarela đã nói, hãy chuyển đến Tệp- > Cấu trúc dự án-> Dự án-> Phiên bản plugin Android Gradle và hạ cấp từ 3.5.2 xuống 3.5.1.


8
Đây thực sự không phải là một giải pháp. Android Studio được cằn nhằn mỗi khi nâng cấp ...
doctorram

Câu trả lời này đã lỗi thời, vì việc nâng cấp lên lớp 3.5.3 thay vào đó dường như đã khắc phục được sự cố
rubo77

6

Đặt phụ thuộc dự án thành:

classpath 'com.android.tools.build:gradle:3.5.3'

hoặc mới nhất.

Lưu ý: bằng cách này, vấn đề của tôi đã được giải quyết.


Vấn đề của tôi với lớp 3.5.2 cũng đã được giải quyết trong 3.5.3, nhưng lưu ý: Tôi nhận được cảnh báo `Các tính năng của lớp không được sử dụng trong bản dựng này, khiến nó không tương thích với Lớp 6.0.`
rubo77

1

Vấn đề này đang xảy ra vì phụ thuộc trùng lặp.
Kiểm tra nhiều phụ thuộc trong ứng dụng Gradle.


Đúng, đây là vấn đề. Sẽ có các phụ thuộc trùng lặp trong các tệp lớp của bạn
MariusB

1
@Srinivasan, nếu có trùng lặp, thì nó đã được giải quyết bằng cách loại trừ hoặc chọn lọc trong bao bì, nhưng nó chỉ xảy ra với plugin Gradle. Tôi vẫn chưa xác minh chính xác hơn và tạo một ứng dụng mẫu để tạo lại vấn đề khi thêm yêu cầu trong bugtracker cho android studio.
Rajen Raiyarela

0

Hoặc là gói một lần hoặc không hoàn toàn:

android {
    packagingOptions {
        pickFirst "META-INF/MANIFEST.MF"
        // exclude "META-INF/MANIFEST.MF"
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.