在将Android Studio的Gradle插件升级到3.0.1和Gradle升级到4.1之后,无法复制配置的依赖性

71 人关注

我曾经使用这个简单的gradle任务将 "编译 "依赖项复制到一个特定的文件夹。

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

但就在我使用gradle plugin 3.0.1 for Android Studio和Gradle工具升级到4.1之后,它就停止工作了。由于依赖性配置 "编译 "现在已经被https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations我把它改为 "实施"。然而,我无法使用我的copyLibs任务,因为根据Gradle的构建错误输出,直接解决配置 "实施 "是不允许的。

$ ./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

请看以下我目前的app模块的build.gradle文件:应用插件。'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

如果我使用 "编译",它就能工作,但我想遵守关于这个插件用法的最新建议。

我需要帮助来升级我的copyLibs任务,以便像升级环境之前那样工作。 我在使用Android Studio的gradle插件2.2.3和Gradle工具2.14.1。

1 个评论
此外,还可以看到一位同事在以下网站上提出的票据 discuss.gradle.org/t/...
android
android-studio
android-gradle-plugin
build.gradle
gradle-plugin
Rafael
Rafael
发布于 2017-12-21
7 个回答
the anonymous user
the anonymous user
发布于 2022-11-05
已采纳
0 人赞同

而不是使用 configurations.implementation ,最佳选择是使用 configurations.runtimeClasspath

你也可以考虑一下。 编译路径(compileClasspath

racs
实际上,这是个更优雅的解决方案。只需将 configurations.compile 替换为 configurations.compileClasspath ,就能正常工作(至少对我来说)。
它说。 Could not get unknown property 'runtimeClasspath' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer. 。我错过了什么吗?替换代码1】也是如此。我的代码看起来是一样的,只是它是一个库而不是一个应用程序。
@Bot 已经过去几个月了,所以我不太记得我是怎么解决的了。我需要在maven/artifactory中包含所有的依赖项,现在这对我来说很有效。你到底想达到什么目的?
Bot
@kristyna,我把gradle插件升级到了3.1.2,对我来说很有效。谢谢你的回答。
Ivan
替换代码0】对我来说很好用(对于安卓系统 java-library )。
act262
act262
发布于 2022-11-05
0 人赞同

我使配置成为可解析的,所以在获取依赖关系时没有例外。

configurations.implementation.setCanBeResolved(true)
configurations.api.setCanBeResolved(true)
println configurations.implementation.resolve()
println configurations.api.resolve()
    
在我看来,这是最干净的解决方案!+1
你会把这个代码放在你的 build.gradle 中的什么地方?当我试图添加它时,我一直得到错误 > Cannot change strategy of configuration ':app:api' after it has been resolved.
你好,在任何任务中,像这样,在另一个配置前面或只是在:)前面:任务copyAndroidNatives() { ......配置.implementation.setCanBeResolved(true) 配置.api.setCanBeResolved(true) 配置....
mortalis
mortalis
发布于 2022-11-05
0 人赞同

另一个建议。

我创建了我的自定义配置,然后把它作为 configurations.customConfig

configurations {
  customConfig.extendsFrom implementation

必须对复制任务进行相应的编辑。

task copyLibs(type: Copy) {
    from configurations.customConfig
    into "$project.rootDir/reports/libs/"
    
我对这个解决方案超级怀疑,但它确实有效。
我明白,这其实是正确的解决方案。Gradle 6.4已经提示 [...] 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. 。相应的任务 copyLibs 会复制 from configurations.customConfig
Shouldn't it be from configuration.customConfig ?
应该如此。谢谢。
Cornelia Xaos
Cornelia Xaos
发布于 2022-11-05
0 人赞同

看起来似乎没有办法获得 implementation 的依赖性列表和 compileClasspath 提到的 Gradle的票据 如果你直接使用安卓系统,拉斐尔发布的程序就无法工作,就像我的情况一样,我需要导出依赖项,以便 Unity3D 可以把它们包装起来,以便发布。

所以......在这种情况下,看起来唯一的解决办法是使用被废弃的 compile 类型。

ViníciusPJ
ViníciusPJ
发布于 2022-11-05
0 人赞同

这可能不会有帮助,或者有更好的解决方法,但...

你可以把你的依赖关系放在一个有可能复制的方式中,做以下事情。

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/"

如果你有一个Jar任务,因为你从compile变成了implementation而停止将依赖关系放到jar文件中,这也会有帮助。

你可以使用。

from {configurations.myConfig.collect { it.isDirectory() ? it : zipTree(it) }}
from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
    
classpath 'com.android.tools.build:gradle:3.2.1' distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip 。我不确定它是否仍然有效...
如果你按照你的建议去做,你应该收到某种重复的错误。例如,"重复的类android.arch.core.internal.SafeIterableMap"。
smac89
smac89
发布于 2022-11-05
0 人赞同

我从gradle 5.5升级到5.6后开始得到这个错误,当我试图在intelliJ中同步项目时,它就发生了。

感谢这个 答案 在另一个问题上,我通过应用以下方法解决了这个问题 idea plugin 到所有项目,然后运行 gradle cleanIdea ,之后一切又开始工作。

又是一天,又是一个#无法解释的问题的解决方案。