在Room persistence上构建版本时,错误[DuplicatePlatformClasses]类发生冲突

时间:2017-11-16 18:58:48

标签: android gradle android-gradle android-manifest android-room

我已经使用本指南在我的Android应用中使用Room构建持久性: https://developer.android.com/training/data-storage/room/index.html

并添加了如下所示的依赖: https://developer.android.com/topic/libraries/architecture/adding-components.html

当我构建调试版本并沉溺于手机时,everithing工作正常。

当我构建发布签名APK时,我收到此错误消息:

Error:Error: json defines classes that conflict with classes now provided by Android. Solutions include finding newer versions or alternative libraries that don't have the same problem (for example, for httpclient use HttpUrlConnection or okhttp instead), or repackaging the library using something like jarjar. [DuplicatePlatformClasses]

我的app.gradle:

apply plugin: 'com.android.application'

android {
    signingConfigs {
        /* TODO(developer): Configure to sign app with a release key for testing.
        release {
            storeFile file('path/to/release/signing/key')
            keyAlias 'release_key_alias'
            keyPassword "${password}"
            storePassword "${password}"
        }*/
    }
    compileSdkVersion 26
    buildToolsVersion '26.0.2'

    defaultConfig {
        applicationId "myappid"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 10
        versionName "1.8"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // TODO(developer): uncomment below once config above is complete and uncommented.
            //signingConfig signingConfigs.release

        }
    }
}
configurations {
    all {
        exclude module: 'httpclient'
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:26.1.0'
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.volley:volley:1.0.0'
    compile 'com.github.nkzawa:socket.io-client:0.3.0'
    compile 'io.socket:socket.io-client:0.8.3'
    compile 'com.android.support:design:26.1.0'
    compile 'android.arch.persistence.room:runtime:1.0.0'
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
}

我的project.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        //classpath 'io.socket:socket.io-client:0.8.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
ext{
    roomVersion = '1.0.0'
}
allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

有人可以帮忙或给我线索吗?

4 个答案:

答案 0 :(得分:10)

我终于发现问题是一个JSON子模块:

compile 'com.github.nkzawa:socket.io-client:0.3.0'

这个库有一个子模块:

org.json:json

现在与android原生模块冲突,因为在我的其他依赖项中,我无法找到这个。它在10天前工作正常。 我也不得不杀了这个:

compile 'io.socket:socket.io-client:0.8.3'

最终的解决方案是为模块添加一个排除,并改变这样的行:

    implementation ('com.github.nkzawa:socket.io-client:0.3.0',{
         exclude group:'org.json', module:'json'
    })

我也注意到,我解决了错误日志中的问题,这是一个冲突的模块,但即使我读了一百次,我之前没有注意到: enter image description here

所以也许google或Intellij可以改善这些错误的写作......

要发现此类重复冲突错误模块,我发现最好的方法是创建一个新项目并粘贴到app build.gradle中的依赖项中,然后逐个检查它们或者使用" dividi et impera& #34;,也许这对某人来说是一个明显的建议,但我希望能早点得到它。

答案 1 :(得分:0)

我遇到了同样的问题,并通过gradle依赖关系树搜索了冲突:

gradlew app:dependencies

然后我排除了冲突库的json模块:

implementation ('<conflicting-library>',{
     exclude group:'org.json', module:'json'
})

答案 2 :(得分:0)

如何查找重复的库。

打开gradle运行窗口并运行以下命令:

gradle module-name:dependencies

“模块名称”应该是您应用模块的名称,对我来说,它是“ osmunda-demo”。

Screenshot

然后使用Ctrl + F搜索“公共记录”,您将找到它。

enter image description here

答案 3 :(得分:0)

@Romeo 提出了一个非常好的观点。几个小时都无法调试代码。问题在于在 build.gradle 中导入的依赖项。它可能是您自己的自定义 sdk/工件。我自己的使用 jjwt 的库有问题。我在我的 sdk 中添加了排除项,但每次使用 sdk 时都必须再次添加它。确保在您的工件实现中添加 exclude group: 'org.json', module: 'json'