8
votes

Type de programme déjà présent: com.google.common.util.concurrent.ListenableFuture

Je viens de convertir mon projet en androidx et j'obtiens maintenant l'erreur "Type de programme déjà présent" pour com.google.common.util.concurrent.ListenableFuture .

J'ai parcouru plusieurs solutions stackoverflow et une partie de la documentation Gradle et ne parviennent toujours pas à le faire fonctionner.

Le problème est qu'il existe deux versions de ListenableFuture apportées par Gradle dans ces modules:

+--- androidx.core:core:1.1.0-alpha03@aar
+--- androidx.concurrent:concurrent-futures:1.0.0-alpha02@jar
+--- com.google.guava:listenablefuture:1.0@jar   

Je suppose que je veux exclure le second, mais je ne sais pas comment le faire.

Vous pouvez voir ce que j'ai essayé dans mon fichier gradle, mais pas de joie pour l'instant.

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.drme.weathertest"
        minSdkVersion 26
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

//    added 1/2/19 to try and prevent java.lang.NoClassDefFoundError: Failed resolution of:
//    Landroid/view/View$OnUnhandledKeyEventListener;
    configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            def requested = details.requested
            if (requested.group == "com.android.support") {
                if (!requested.name.startsWith("multidex")) {
                    details.useVersion "26.+"
                }
            }
        }
//        resolutionStrategy.force 'com.google.quava.listenablefuture:1.0',
//                'com.google.common.util.concurrent.listenablefuture'
    }

//    compile('com.google.guava:listenablefuture:1.0@jar') {
//        // causing "Program type already present" compile errors
//        //exclude("com.google.guava:listenablefuture:1.0")
//        exclude('com.google.guava:listenablefuture')
//        exclude('listenablefuture-1.0.jar')
//        //exclude("maven.com.google.quava.listenablefuture")
//    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/java/com.drme.weatherNoaa/Data', 'src/main/java/2']
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

dependencies {
    // causing "Program type already present" compile errors // did not fix problem
    implementation('com.google.guava:listenablefuture:1.0') {
        exclude module: 'com.google.guava:listenablefuture'
    }
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'androidx.arch.core:core-testing:2.0.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.1.0-alpha01"
    annotationProcessor "androidx.room:room-compiler:2.1.0-alpha03"
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.test.espresso:espresso-core:3.1.1'
    implementation 'com.google.code.gson:gson:2.8.2'
    testImplementation 'junit:junit:4.12'
    implementation 'androidx.test:runner:1.1.1'
    implementation 'androidx.preference:preference:1.1.0-alpha02'
    implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha01'
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
    implementation 'androidx.media:media:1.1.0-alpha01'
    implementation 'androidx.room:room-runtime:2.1.0-alpha03'
    implementation 'androidx.room:room-testing:2.1.0-alpha03'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3'
    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'androidx.core:core:1.1.0-alpha03'
    implementation 'androidx.room:room-compiler:2.1.0-alpha03'
}

Si je regarde correctement les dépendances, il semble que cela provienne de androidx.core: core: 1.1.0-alpha03 .

Gradle: com.google.quava:quava:23.5jre@jar 
Gradle: com.google.guava:listenablefuture:1.0@jar

Des suggestions seraient appréciées. Merci.


0 commentaires

3 Réponses :


3
votes

vous ne pouvez pas exclure listenablefuture de listenablefuture

... essayez plutôt quelque chose de similaire:

implementation ("androidx.core:core:1.1.0-alpha03") {
    exclude group: "com.google.guava", module: "listenablefuture"
}

p >


1 commentaires

Martin: Cela n'a pas fonctionné pour moi, mais cela m'a donné d'autres idées à essayer. Voir ma réponse à ma question. Merci pour l'aide.



15
votes

J'ai trouvé le problème et la réponse. En regardant les bibliothèques externes dans la vue Projet, j'ai trouvé ce qui suit:

configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            def requested = details.requested
            if (requested.group == "com.android.support") {
                if (!requested.name.startsWith("multidex")) {
                    details.useVersion "26.+"
                }
            }
        }

        all*.exclude group: 'com.google.guava', module: 'listenablefuture' <===This fixed the problem
    }

La seule chose dans la deuxième entrée était le double ListenableFuture.

En créant l'entrée suivante dans le fichier de construction gradle, ce problème a disparu:

Gradle: com.google.guava:guava:23.5-jre@jar 
 |_ guava-23.5-jre.jar 
    |_com.google
      |_common 
        |_util.concurrent
          |_ListenableFuture

Gradle: com.google.guava:listenablefuture:1.0@jar
 |_listenablefuture-1.0.jar
   |_com.google.common.util.concurrent
     |_ListenableFuture

Je ne pouvais pas comprendre ce qui générait le com.google.guava: listenablefuture: 1.0@jar code>, mais le problème qui en résulte a été résolu.

Merci à tous ceux qui ont examiné le problème.


5 commentaires

Type de programme déjà présent signifie qu'il y a des classes en double ... l'exclusion de toutes les occurrences a probablement des effets secondaires indésirables; mieux vaut en garder un. ./gradlew app: dependencies les listerait. si mon approche ne fonctionnait pas, il pourrait y avoir plus de deux occurrences présentes.


Martin: Merci pour la suggestion. Je ne connais que les deux fichiers build.gradle de mon projet Android Studio et je n'ai pas pu comprendre comment exécuter votre suggestion pour répertorier les dépendances. J'ai regardé la documentation de Gradle et j'ai failli tuer mon projet en essayant d'ajouter des analyses de build. :) Pourriez-vous fournir un lien pour montrer comment mettre en œuvre votre suggestion plus en détail? Je ne suis pas un gourou de la ligne de commande. Merci.


il donne la configuration d'erreur ': app: annotationProcessor' après avoir été inclus dans la résolution des dépendances.


C'est ce que je n'avais qu'à inclure dans le fichier gradle de mon application configurations.all {all * .exclude group: 'com.google.guava', module: 'listenablefuture'}


Son travail mais a eu un problème: Causé par: java.lang.ClassNotFoundException: androidx.work.impl.utils.futures.AbstractFuture



2
votes

La mise à jour de androidx.core: core-ktx vers la version 1.1.0-rc01 a également résolu le problème.


0 commentaires