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’
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.
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
Akt262
Ich mache die Konfiguration auflösbar, sodass es beim Abrufen der Abhängigkeiten keine Ausnahme gibt
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
sterblich
Ein weiterer Vorschlag.
Ich habe meine benutzerdefinierte Konfiguration erstellt und sie dann als verwendet configurations.customConfig:
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
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
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 ideaPlugin 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
12283000cookie-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 werdenyes
Siehe auch ein Ticket von einem Kollegen unter diskutiere.gradle.org/t/…
– Raffael
5. Januar 2018 um 16:22 Uhr