Konfigurationsabhängigkeiten können nach dem Upgrade des Gradle-Plugins für Android Studio auf 3.0.1 und Gradle auf 4.1 nicht kopiert werden

Lesezeit: 6 Minuten

Früher habe ich Abhängigkeiten zum Kompilieren mit dieser einfachen Gradle-Aufgabe in einen bestimmten Ordner kopiert:

task copyLibs(type: Copy) {
    from configurations.compile
    into "$project.rootDir/reports/libs/"
}

Aber es funktionierte nicht mehr, nachdem ich mein Android-Projekt mit dem Gradle-Plugin 3.0.1 für Android Studio und dem Gradle-Tool auf 4.1 aktualisiert hatte. Da die Abhängigkeitskonfiguration ‘compile’ jetzt veraltet ist von https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations Ich habe es auf “Implementierung” geändert. Ich kann jedoch meine copyLibs-Aufgabe nicht verwenden, da das direkte Auflösen der Konfiguration „Implementierung“ gemäß der Gradle-Erstellungsfehlerausgabe nicht zulässig ist:

$ ./gradlew.bat clean build

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':app:copyLibs'.
> Resolving configuration 'implementation' directly is not allowed

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

* Get more help at https://help.gradle.org

BUILD FAILED in 1s

Siehe folgende meine aktuelle build.gradle-Datei für das App-Modul: Plugin anwenden: ‘com.android.application’

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "newgradle.com.testingnewgradle"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    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:26.1.0'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

task copyLibs(type: Copy) {
    from configurations.implementation
    into "$project.rootDir/reports/libs/"
}
build.dependsOn copyLibs

Wenn ich ‘kompilieren’ verwende, funktioniert es, aber ich möchte die Verwendung der neuesten Empfehlung zu diesem Plugin einhalten.

Ich brauche Hilfe beim Upgrade meiner copyLibs-Aufgabe, damit sie wie vor dem Upgrade meiner Umgebung funktioniert. Ich habe das Gradle-Plugin 2.2.3 für Android Studio und das Gradle-Tool 2.14.1 verwendet.

Benutzer-Avatar
der anonyme Benutzer

statt zu verwenden configurations.implementationist die beste Option zu verwenden configurations.runtimeClasspath.

Sie können auch an Folgendes denken: compileClasspath default

  • Eigentlich ist das eine elegantere Lösung. Einfach ersetzen configurations.compile durch configurations.compileClasspath und es funktioniert (zumindest bei mir) einwandfrei.

    – Rassen

    22. Oktober 2018 um 5:18 Uhr


  • Es sagt: Could not get unknown property 'runtimeClasspath' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.. Habe ich etwas verpasst? Dasselbe für compileClasspath. Mein Code sieht genauso aus, außer dass es sich um eine Bibliothek und nicht um eine App handelt.

    – Kristina

    7. Februar 2019 um 17:23 Uhr

  • @Bot es ist ein paar Monate her, also erinnere ich mich nicht wirklich, wie ich es gelöst habe. Ich musste alle Abhängigkeiten in maven/artifactory aufnehmen und das funktioniert jetzt für mich. Was genau versuchst du zu erreichen?

    – Kristina

    30. August 2019 um 16:49 Uhr

  • @kristyna, ich habe das Gradle-Plugin auf 3.1.2 aktualisiert und es hat bei mir funktioniert. Danke für deine Antwort.

    – bot

    3. September 2019 um 6:35 Uhr

  • configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } hat bei mir gut funktioniert (für android java-library)

    – Iwan

    20. Oktober 2019 um 16:39 Uhr


Benutzer-Avatar
Akt262

Ich mache die Konfiguration auflösbar, sodass es beim Abrufen der Abhängigkeiten keine Ausnahme gibt

configurations.implementation.setCanBeResolved(true)
configurations.api.setCanBeResolved(true)

println configurations.implementation.resolve()
println configurations.api.resolve()

  • Das ist meiner Meinung nach die sauberste Lösung! +1

    – Quark0

    22. August 2019 um 20:37 Uhr

  • Wo würden Sie diesen Code in Ihre einfügen build.gradle? Ich bekomme immer den Fehler > Cannot change strategy of configuration ':app:api' after it has been resolved. wenn Sie versuchen, es hinzuzufügen.

    – Schicksalsglaube

    14. April 2020 um 17:29 Uhr

  • Hallo, in jeder Aufgabe, wie dieser, vor anderen Konfigurationen oder direkt vor :): task copyAndroidNatives() { … configurations.implementation.setCanBeResolved(true) configurations.api.setCanBeResolved(true) configurations… .

    – Jefimenko Jewgen

    21. Februar um 3:55

Benutzer-Avatar
sterblich

Ein weiterer Vorschlag.

Ich habe meine benutzerdefinierte Konfiguration erstellt und sie dann als verwendet configurations.customConfig:

configurations {
  customConfig.extendsFrom implementation
}

Der Kopierauftrag muss entsprechend bearbeitet werden:

task copyLibs(type: Copy) {
    from configurations.customConfig
    into "$project.rootDir/reports/libs/"
}

  • Ich war sehr skeptisch gegenüber dieser Lösung, aber sie funktioniert tatsächlich.

    – dora2010

    29. November 2019 um 14:57 Uhr

  • Ich verstehe, dass dies tatsächlich die richtige Lösung ist. Gradle 6.4 schlägt bereits vor [...] Resolving dependency configuration 'implementation' is not allowed as it is defined as 'canBeResolved=false'. Instead, a resolvable ('canBeResolved=true') dependency configuration that extends 'implementation' should be resolved. Die entsprechende Aufgabe copyLibs wird kopieren from configurations.customConfig.

    – Alberto

    18. Mai 2020 um 8:11 Uhr

  • Sollte es nicht sein from configuration.customConfig?

    – Chris Watt

    1. Dezember 2020 um 16:20 Uhr

  • Es sollte. Vielen Dank.

    – sterblich

    3. Dezember 2020 um 14:30 Uhr

Benutzer-Avatar
Cornelia Xaos

Es sieht nicht so aus, als gäbe es eine Möglichkeit, die Liste von zu erhalten implementation Abhängigkeiten und die compileClasspath erwähnt bei das Gradle-Ticket Rafael posted funktioniert nicht, wenn Sie direkt mit Android arbeiten, wie in meinem Fall, in dem ich die Abhängigkeiten exportieren muss, damit sie exportiert werden können Unity3D kann sie für die Veröffentlichung verpacken.

Es sieht also so aus, als ob die einzige Lösung in diesem Fall darin besteht, die veraltete zu verwenden compile Typ.

Dies wird wahrscheinlich nicht helfen oder einen besseren Lösungsweg haben, aber …

Sie können Ihre Abhängigkeiten so platzieren, dass sie kopiert werden können, indem Sie Folgendes tun:

android { ... }

// Add a new configuration to hold your dependencies
configurations {
    myConfig
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

    // Now you have to repeat adding the dependencies you want to copy in the 'myConfig'
    myConfig fileTree(dir: 'libs', include: ['*.jar'])
    myConfig 'com.android.support:appcompat-v7:26.1.0'
    myConfig 'com.android.support:support-v4:26.1.0'
    ...
}

task copyLibs(type: Copy) {
    // Now you can use 'myConfig' instead of 'implementation' or 'compile' 
    from configurations.myConfig 
    into "$project.rootDir/reports/libs/"
}

Dies hilft auch, wenn Sie eine Jar-Aufgabe haben, die aufhört, die Abhängigkeiten in der JAR-Datei zu platzieren, weil Sie von geändert haben compile zu implementation.

Sie können Folgendes verwenden:

from {configurations.myConfig.collect { it.isDirectory() ? it : zipTree(it) }}

Anstatt von:

from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}

  • Mit classpath 'com.android.tools.build:gradle:3.2.1' und distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip. Ich bin mir nicht sicher, ob es noch funktioniert…

    – Damiii

    12. Februar 2019 um 9:49 Uhr

  • Wenn Sie tun, was Sie vorschlagen, sollten Sie eine Art Duplizierungsfehler erhalten. Wie “Doppelte Klasse android.arch.core.internal.SafeIterableMap”.

    – Portfoliobuilder

    9. Juli 2019 um 22:16 Uhr

Benutzer-Avatar
smac89

Ich habe diesen Fehler nach dem Upgrade von Gradle 5.5 auf 5.6 erhalten, und es passiert, wenn ich versuche, das Projekt in intelliJ zu synchronisieren.

Dank dieser Antwort auf eine andere Frage habe ich sie gelöst, indem ich die angewendet habe idea Plugin zu allen Projekten und läuft dann gradle cleanIdea und danach hat alles wieder funktioniert.

Ein weiterer Tag, eine weitere #unerklärliche Lösung für ein Problem.

  • Mit classpath 'com.android.tools.build:gradle:3.2.1' und distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip. Ich bin mir nicht sicher, ob es noch funktioniert…

    – Damiii

    12. Februar 2019 um 9:49 Uhr

  • Wenn Sie tun, was Sie vorschlagen, sollten Sie eine Art Duplizierungsfehler erhalten. Wie “Doppelte Klasse android.arch.core.internal.SafeIterableMap”.

    – Portfoliobuilder

    9. Juli 2019 um 22:16 Uhr

1228300cookie-checkKonfigurationsabhängigkeiten können nach dem Upgrade des Gradle-Plugins für Android Studio auf 3.0.1 und Gradle auf 4.1 nicht kopiert werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy