在我的Android项目中,我有一个将构建依赖项复制到外部目录的任务,如下所示:
task copyBuildDependencies(type: Copy) {
delete "$buildDir/dependencies"
afterEvaluate {
from configurations.releaseCompileClasspath
into "$buildDir/dependencies"
doLast {
FileTree files = fileTree("$buildDir/dependencies")
files.forEach { file ->
if (file.isFile() && file.name.endsWith(".aar")) {
copy {
from zipTree(file).matching { include "*.jar" }
into "$buildDir/dependencies"
eachFile {
it.path = it.path.replace(it.name, "${file.name}-${it.name}")
}
}
}
}
}
}
}我与项目依赖项有正常的依赖关系:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
...
implementation 'com.google.guava:guava:11.0.2'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.22.5'
// Note: These are Android Library projects
implementation project(':genericutils')
implementation project(':module2')
...
}当我运行任务copyBuildDependencies时,我得到以下错误:
Executing task 'copyBuildDependencies'...
Executing tasks: [copyBuildDependencies]
Configuration on demand is an incubating feature.
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine the dependencies of task ':BiometricInterfaceLib:copyBuildDependencies'.
> Could not resolve all task dependencies for configuration ':BiometricInterfaceLib:releaseCompileClasspath'.
> More than one variant of project :genericutils matches the consumer attributes:
- Configuration ':genericutils:releaseApiElements' variant android-aidl:
- Found artifactType 'android-aidl' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':genericutils:releaseApiElements' variant android-classes:
- Found artifactType 'android-classes' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':genericutils:releaseApiElements' variant android-manifest:
- Found artifactType 'android-manifest' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':genericutils:releaseApiElements' variant android-renderscript:
- Found artifactType 'android-renderscript' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':genericutils:releaseApiElements' variant jar:
- Found artifactType 'jar' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
> More than one variant of project :module2 matches the consumer attributes:
- Configuration ':module2:releaseApiElements' variant android-aidl:
- Found artifactType 'android-aidl' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':module2:releaseApiElements' variant android-classes:
- Found artifactType 'android-classes' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':module2:releaseApiElements' variant android-manifest:
- Found artifactType 'android-manifest' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':module2:releaseApiElements' variant android-renderscript:
- Found artifactType 'android-renderscript' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Configuration ':module2:releaseApiElements' variant jar:
- Found artifactType 'jar' but wasn't required.
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 2s
16:39:07: Task execution finished 'copyBuildDependencies'.我可以在configurations.releaseCompileClasspath上使用排除模块选项,但是assembleRelease任务会失败,因为它找不到依赖项。
编辑:我创建了一个示例项目,以帮助显示我所追求的结果和我所面临的问题:https://gitlab.com/crunchy234/android-gradle-dependencies-export
--编辑2--
之所以需要库模块的依赖关系而不是库的Jar,是因为可以创建Xamarin绑定库。
因此,Xamarin绑定所需要的是库的AAR (示例代码中的主模块)和库依赖项的所有Jars。例如:
mastermodule/build/dependencies/
├── animated-vector-drawable-28.0.0-alpha3.aar-classes.jar
├── annotations-13.0.jar
...
├── collections-28.0.0-alpha3.jar
├── common-1.1.1.jar
├── coordinatorlayout-28.0.0-alpha3.aar-classes.jar
...
etc发布于 2018-07-02 07:40:57
如果我正确理解
可能下面就是你想要的。将其添加到build.gradle下的根项目中。
// Add this into the build.gradle under **root** project.
// Add the modules that you want to exclude from having this copyXXXJar task.
def modulesExcluded = [
'app',
'mastermodulewantedoutput'
]
subprojects { prj ->
// Skip excluded modules
if (modulesExcluded.contains(prj.name)) {
prj.afterEvaluate {
tasks['preBuild'].dependsOn(copyModuleJars)
}
return
}
prj.afterEvaluate {
/**
* Dynamically create task "copyXXXJar" according to build variant of each library module.
*/
android.libraryVariants.all { variant ->
def capitalizedVariantName = variant.name.capitalize()
def variantName = variant.flavorName
if (!variantName || variantName == "") {
variantName = variant.buildType.name
} else {
variantName += "-${variant.buildType.name}"
}
//================================================================================
// Define build/copy variant jar and copy to dependencies
//================================================================================
def copyJarTask = project.tasks.create("copy${capitalizedVariantName}Jar", Copy) {
group "Copy Jar"
description "Rename the classes.jar to ${project.name}-${variantName}.jar and copy it into dist folder."
def fromDirModule = "$buildDir/outputs/aar/${project.name}-${variantName}.aar"
def intoDirModule = "$rootDir/dependencies/$variant.buildType.name"
from(zipTree(fromDirModule))
into(intoDirModule)
include('*.jar')
include('libs/*.jar')
rename('classes.jar', "${project.name}-${variantName}.jar")
dependsOn "assemble${capitalizedVariantName}"
}
copyModuleJars.dependsOn(copyJarTask)
}
}
}
// Task to copy all the modules' jars. It can be run with command [ ./gradlew copyModuleJars ]
task copyModuleJars {
group = 'Copy Jar'
description = 'Copy the classes.jar from each module.'
} 运行下面的命令来验证
./gradlew copyModuleJars希望能帮上忙。
-编辑的
我检查了你的gitlab项目。看起来你只需要.aar里面的罐子。我想说的是,这可能会导致一些问题,因为您删除了相关的res文件、aidl文件、资产和R.txt等,这些文件被认为是.aar库的必要部分。例如,您的依赖关系aar appcompat-v7-28.0.0-alpha3,在解压缩时实际上将具有下面的布局,而不仅仅是classes.jar。

此外,您可以像我前面编辑的那样简单地修改modulesExcluded数组。并且可以消除"hasProperty()“的状态检查。
输出将在"$rootDir/dependencies".下如下所示:
这些jars是从您自己的源代码(即genericutils和mastermodule源代码)中生成的。如果库的传递依赖关系是".jar“格式,它们将进入.aar的"libs/”格式,如果它们是".aar“格式,我认为您不能简单地选择它的classes.jar,但是去掉它相关的和必要的部分,除非您有一些特殊的要求,而那些缺失的部分与您的项目无关。
-编辑2
如果您只关心源代码,并且不使用代码逻辑中的任何资源(res、R.txt、aidl、jni等),例如,您的genericutils模块可能就是这样的情况,那么您只需选择classes.jar。当您将它作为普通Java库使用时,它不会引起任何问题。
https://stackoverflow.com/questions/51129245
复制相似问题