1

I was recently updating my App dependencies and when trying to update the safeargs navigation component gradle plugin to 2.2.1 (actually happens with 2.2.0 too) like this:

dependencies { 
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.1"
    ...
}

I'm getting the following error when trying to compile the project:

Unable to find method 'com.squareup.kotlinpoet.ClassName.<init>(Ljava/lang/String;[Ljava/lang/String;)V'.
Possible causes for this unexpected error include:
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)

The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
Stop Gradle build processes (requires restart)

Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.

In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

I tried all those solutions, none worked.


Gradle Files

build.gradle(project)


// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.71'
    ext.navControllerVersion = '2.1.0'
    ext.apolloVersion = '1.4.3'

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.apollographql.apollo:apollo-gradle-plugin:$apolloVersion"
        classpath 'com.google.gms:google-services:4.3.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

//Plugin added to check if the project has the last dependencies. You can run a gradle task via terminal with:
// ./gradlew dependencyUpdates
plugins {
    id 'com.github.ben-manes.versions' version '0.28.0'
}
//This configuration is added for the ben-manes' plugin to ignore alpha, beta, rc, and so on updates
dependencyUpdates.resolutionStrategy {
    componentSelection { rules ->
        rules.all { ComponentSelection selection ->
            boolean rejected = ['alpha', 'beta', 'rc', 'cr', 'm', 'preview'].any { qualifier ->
                selection.candidate.version ==~ /(?i).*[.-]${qualifier}[.\d-]*/
            }
            if (rejected) {
                selection.reject('Release candidate')
            }
        }
    }
}

apply from: 'dependencies.gradle'
apply plugin: 'com.github.ben-manes.versions'

def versionMajor = 0
def versionMinor = 0
def versionPatch = 0
def versionBuild = 7 // bump for dogfood builds, public betas, etc.

allprojects {
    repositories {
        google()
        jcenter()
    }

    ext {
        androidApplicationId = 'es.client.mobile.android.appname'
        androidVersionCode = versionMajor * 1000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild
        androidVersionName = "${versionMajor}.${versionMinor}.${versionPatch}.${versionBuild}"
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
build.gradle(:app)


apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: "androidx.navigation.safeargs.kotlin"

buildscript {
    repositories {
        google()
        jcenter()
        maven { url "https://salesforce-marketingcloud.github.io/MarketingCloudSDK-Android/repository" }
    }
    dependencies {
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navControllerVersion"
    }
}

android {
    def globalConfiguration = rootProject.extensions.getByName("ext")

    compileSdkVersion globalConfiguration["androidCompileSdkVersion"]
    testOptions.unitTests.includeAndroidResources = true

    defaultConfig {
        minSdkVersion globalConfiguration["androidMinSdkVersion"]
        targetSdkVersion globalConfiguration["androidTargetSdkVersion"]

        applicationId globalConfiguration["androidApplicationId"]
        versionCode globalConfiguration["androidVersionCode"]
        versionName globalConfiguration["androidVersionName"]

        testInstrumentationRunner "es.client.mobile.android.appname.app.test.TestRunner"

        buildConfigField "String", "MC_APP_ID", MC_APP_ID
        buildConfigField "String", "MC_ACCESS_TOKEN", MC_ACCESS_TOKEN
        buildConfigField "String", "MC_SENDER_ID", MC_SENDER_ID
        buildConfigField "String", "MC_MID", MC_MID
        buildConfigField "String", "MC_SERVER_URL", MC_SERVER_URL
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

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

    lintOptions {
        quiet true
        abortOnError false
        ignoreWarnings true
        disable 'GoogleAppIndexingWarning'  //For removing warning about deep linking in Manifest, because this app do not use deep links
    }

    signingConfigs {
        release {
            keyAlias '###'
            keyPassword '####'
            storeFile file('../extras/release/bundle/###.jks')
            storePassword '###'
        }
    }

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

        release {
            signingConfig signingConfigs.release

            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    flavorDimensions 'version'
    productFlavors {
        dev {
            applicationIdSuffix ".dev"
            versionNameSuffix "-dev"
            dimension = 'version'
        }
        integDev {
            applicationIdSuffix ".ind"
            versionNameSuffix "-ind"
            dimension = 'version'
        }
        integPre {
            applicationIdSuffix ".inp"
            versionNameSuffix "-inp"
            dimension = 'version'
        }
        pro {
            applicationIdSuffix ".pro"
            versionNameSuffix "-pro"
            dimension = 'version'
        }
    }

    dataBinding {
        enabled = true
    }
}

androidExtensions {
    experimental = true
}

dependencies {
    def appDependencies = rootProject.ext.appDependencies
    def appTestDependencies = rootProject.ext.appTestDependencies
    def developmentDependencies = rootProject.ext.developmentDependencies

    implementation project(':model')
    implementation project(':domain')
    implementation project(':data')
    implementation project(':datasources')

    implementation appDependencies.kotlin
    implementation appDependencies.koin
    implementation appDependencies.koinCompile
    implementation appDependencies.koinArch
    implementation appDependencies.ktxCore
    implementation appDependencies.androidAnnotation
    implementation appDependencies.appcompat
    implementation appDependencies.recyclerView
    implementation appDependencies.constraintLayout
    implementation appDependencies.materialDesign
    implementation appDependencies.lifecycleExtensions
    implementation appDependencies.lifecycleCommonJava8
    implementation appDependencies.navigationFragment
    implementation appDependencies.navigationUi
    implementation appDependencies.roomRuntime
    implementation appDependencies.rxJava
    implementation appDependencies.rxAndroid
    implementation appDependencies.rxKotlin
    implementation appDependencies.glide
    implementation appDependencies.timber
    implementation appDependencies.googleMaps
    implementation appDependencies.googleMapsUtils
    implementation appDependencies.googleLocation
    implementation appDependencies.viewpager2
    implementation appDependencies.playServicesAuth
    implementation appDependencies.facebookSdk
    implementation appDependencies.firebaseAnalytics
    implementation appDependencies.firebaseCore
    implementation appDependencies.firebaseMessaging
    implementation appDependencies.marketingCloud
    implementation appDependencies.googleServices
    implementation appDependencies.zXing
    implementation appDependencies.zXingEmbedded

    // Unit test dependencies
    implementation 'androidx.appcompat:appcompat:1.1.0'
    testImplementation appTestDependencies.kotlinJUnit
    testImplementation appTestDependencies.mockitoKotlin
    testImplementation appTestDependencies.mockitoInline

    // Instrumentation test dependencies
    androidTestImplementation appTestDependencies.junit
    androidTestImplementation appTestDependencies.lifecycleTest
    androidTestImplementation(appTestDependencies.koinTest, {
        exclude group: 'org.jetbrains.kotlin'
        exclude group: 'org.mockito'
    })
    androidTestImplementation(appTestDependencies.mockitoKotlin, {
        exclude group: 'org.jetbrains.kotlin'
        exclude group: 'org.mockito'
    })
    androidTestImplementation appTestDependencies.mockitoAndroid
    androidTestImplementation appTestDependencies.androidJUnit
    androidTestImplementation(appTestDependencies.espressoCore) {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    androidTestImplementation(appTestDependencies.androidRunner) {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    androidTestImplementation(appTestDependencies.androidRules) {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    androidTestImplementation(appTestDependencies.espressoIntents) {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    androidTestImplementation(appTestDependencies.espressoContrib) {
        exclude module: 'appcompat'
        exclude module: 'appcompat-v7'
        exclude module: 'support-v4'
        exclude module: 'support-v13'
        exclude module: 'support-annotations'
        exclude module: 'recyclerview-v7'
        exclude module: 'design'
    }

    //Development
    debugImplementation developmentDependencies.leakCanary
    debugImplementation developmentDependencies.flipper
    debugImplementation developmentDependencies.soloader
    debugImplementation developmentDependencies.flipperLeakcanary
}

apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin

Edit: More debug lead me to the conclusion that this is being caused by a dependency conflict on the kotlinpoet library, because if I change the safe-args plugin to use the java version:

apply plugin: "androidx.navigation.safeargs"

it works as expected. My problem is that when I invoke ./gradlew app:dependencies I'm not getting any dependency on kotlinpoet, so I don't know how to debug the conflict.

Thanks and best regards, Ignacio

Ignacio Ruiz
  • 611
  • 10
  • 21

2 Answers2

3

You've got the code below in your gradle module app instead of having it in gradle project.

Try this:

gradle project:

repositories {
        google()
        jcenter()
        maven { url "https://salesforce-marketingcloud.github.io/MarketingCloudSDK-Android/repository" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.apollographql.apollo:apollo-gradle-plugin:$apolloVersion"
        classpath 'com.google.gms:google-services:4.3.3'
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navControllerVersion"

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

And remove this:

gradle module:

buildscript {
    repositories {
        google()
        jcenter()
        maven { url "https://salesforce-marketingcloud.github.io/MarketingCloudSDK-Android/repository" }
    }
    dependencies {
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navControllerVersion"
    }
}
Biscuit
  • 4,840
  • 4
  • 26
  • 54
  • That did it... I'm so confused. Can you explain why the need on having the buildscript dependencies on the project level gradle if I'm using them only on the app gradle script? – Ignacio Ruiz Apr 06 '20 at 11:58
  • I'm not too experienced with gradle myself but you can look at [this post](https://stackoverflow.com/a/39231028/6074224) that explains the difference between the two files. – Biscuit Apr 06 '20 at 12:02
0

In some cases the issue might be related to an old version of kotlinpoet conflicting with kotlinpoet version included in the SafeArgs lib.

Updating kotlinpoet to 1.4.4 solves the issue.

Antwan
  • 3,837
  • 9
  • 41
  • 62