将 Android Studio 的 Gradle 插件升级到 3.0.1 和 Gradle 到 4.1 后无法复制配置依赖项
Posted
技术标签:
【中文标题】将 Android Studio 的 Gradle 插件升级到 3.0.1 和 Gradle 到 4.1 后无法复制配置依赖项【英文标题】:Not able to copy configurations dependencies after upgrading Gradle plugin for Android Studio to 3.0.1 and Gradle to 4.1 【发布时间】:2018-06-03 06:45:56 【问题描述】:我曾经使用这个简单的 gradle 任务将“编译”依赖项复制到特定文件夹:
task copyLibs(type: Copy)
from configurations.compile
into "$project.rootDir/reports/libs/"
但在使用 gradle plugin 3.0.1 for android Studio 和 Gradle 工具将我的 Android 项目升级到 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 文件:apply plugin: '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.14.1 使用 gradle 插件 2.2.3。
【问题讨论】:
参见discuss.gradle.org/t/…一位同事提出的票 【参考方案1】:最好不要使用configurations.implementation
,而是使用configurations.runtimeClasspath
。
您还可以考虑: 编译类路径 默认
【讨论】:
其实这是一个更优雅的解决方案。只需将configurations.compile
替换为configurations.compileClasspath
就可以了(至少对我而言)。
它说:Could not get unknown property 'runtimeClasspath' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.
。我错过了什么? compileClasspath
也是如此。我的代码看起来一样,只是它是一个库而不是一个应用程序。
@Bot 已经几个月了,所以我真的不记得我是如何解决它的。我需要在 maven/artifactory 中包含所有依赖项,这现在对我有用。你到底想达到什么目的?
@kristyna,我将 gradle 插件升级到 3.1.2,它对我有用。感谢您的回复。
configurations.compileClasspath.collect it.isDirectory() ? it : zipTree(it)
对我来说效果很好(对于 android java-library
)【参考方案2】:
我使配置可以解决,所以没有异常获取依赖的文件
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.
。
嗨,在任何任务中,像这样,在另一个配置之前或就在 :) 之前:task copyAndroidNatives() ...configurations.implementation.setCanBeResolved(true)configurations.api。 setCanBeResolved(true) 配置....【参考方案3】:
另一个建议。
我创建了我的自定义配置,然后将其用作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
。
不应该是from configuration.customConfig
吗?
应该的。谢谢。【参考方案4】:
我想发表评论,但我仍然缺乏这样做所需的声誉(一分!!>.implementation 依赖项列表和the Gradle ticket 中提到的compileClasspath
如果您直接使用Android,Rafael 将无法正常工作,就像我需要的情况一样要导出的依赖项,以便Unity3D 可以打包它们以供发布。
所以.. 在这种情况下,唯一的解决方案似乎是使用已弃用的 compile
类型。
【讨论】:
【参考方案5】:这可能无济于事或有更好的解决方法,但是...
您可以将您的依赖项以一种可以复制的方式进行以下操作:
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”。【参考方案6】:
我从 gradle 5.5 升级到 5.6 后开始出现此错误,当我尝试在 intelliJ 中同步项目时发生此错误。
感谢answer 在另一个问题上,我通过将idea
plugin 应用到所有项目然后运行gradle cleanIdea
来解决它,然后一切又开始工作了。
又是一天,另一个问题的#inexplicable 解决方案。
【讨论】:
以上是关于将 Android Studio 的 Gradle 插件升级到 3.0.1 和 Gradle 到 4.1 后无法复制配置依赖项的主要内容,如果未能解决你的问题,请参考以下文章
如何建立与 Android studio和 gradle android 库
Android Studio 将外部项目添加到 build.gradle
Android Studio apk体积突然变大(升级gradle后)
将 Android Studio 的 Gradle 插件升级到 3.0.1 和 Gradle 到 4.1 后无法复制配置依赖项