【问题标题】:Can android gradle resolve module libraries' dependencies automatically?android gradle 可以自动解析模块库的依赖关系吗?
【发布时间】:2015-12-24 19:57:59
【问题描述】:

设置

我有一个 android 项目设置方式如下:Main 取决于 Module AModule A 取决于 模块 B

A 和 B 都编译成 aar 文件并上传到本地 maven 存储库。在主项目中,模块 A 的导入是显式的。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile(group: 'com.test', name: 'ModuleA', version: '0.0.1', changing: true)
}

错误

在运行 Main 项目时,在 Module A 使用 Module B 的地方失败并出现 NoClassDefFoundError

一旦我将模块 B 显式导入到主项目中,此错误就消失了。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile(group: 'com.test', name: 'ModuleA', version: '0.0.1', changing: true)
    compile(group: 'com.test', name: 'ModuleB', version: '0.0.1', changing: true)
}

问题

gradle 不能自动解决依赖关系?还是我必须在 Main 项目的 build.gradle 中包含所有 Module A 的依赖项?

我认为它与 pom 文件的生成有关,在 pom 文件中你可以定义依赖部分。我们如何让 gradle 知道在生成 pom 文件时包含依赖项?

编辑#1

ModuleA 的 build.gradle 如下所示:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile(group: 'com.test', name: 'ModuleB', version:'0.0.1', ext: 'aar', changing: true)
} 

publishing {
    publications {
        aar(MavenPublication) {
            groupId packageId
            version = versionId
            artifactId libraryId
            artifact("$buildDir/outputs/aar/${project.getName()}-debug.aar")
        }
    }
}

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            maven = true
            username = "admin"
            password = "password"
        }
        defaults {
            publications('aar')
            publishArtifacts = true
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        }
    }
    resolve {
        repository {
            repoKey = 'libs-release'
            maven = true
        }
    }
}

【问题讨论】:

  • 您在模块 A 中是否“提供”了模块 B 的依赖项?
  • @AlbertoAnderickJr 嗯...我有一个“编译”依赖项。
  • 尝试放置提供的依赖项,然后您可以在主项目中使用 ModuleA 和 ModuleB 依赖项进行编译
  • @AlbertoAnderickJr,你的意思是在 ModuleA 的 build.gradle 中有一个 ModuleB 的“提供”范围导入吗?我认为“编译”范围既是“提供”又是“包”
  • 将 ModuleB 打包成 ModuleA 可能是您的问题的原因

标签: android android-studio gradle


【解决方案1】:

“自动”是什么意思?如果在您的 gradle.build 中具有明确名称的已定义路径中不存在依赖项,它将找不到它。可能会引起误解的是,对存储库中库的引用可能包括对其他库的依赖。当 gradle 请求库位置时,服务器会响应一个文件,该文件指定位置依赖项(如果适用)。

aar 文件不包含您的 gradle.build 或 gradle 可以使用的其他依赖项文件,因此您的 Module A gradle.build 中定义的任何依赖项都不适用于您的主 gradle。建造。因此,您不能指望 gradle 会转到 Module B 的源位置,因为它不存在。

我认为存储库中的库并不清楚这一点,因为如果具有依赖项的库位于存储库中,那么当您进行构建时,这些依赖项似乎“神奇地”被包含在内。这是因为库引用可以包含对其他依赖项的引用,并且 gradle 在请求库时会获得该信息。 repo 库条目/定义包括依赖项。

如果这是您正在寻找的行为类型,您应该将您的 aar 放入存储库(公共或自托管)中,然后在存储库中创建适当的库定义(如 pom.xml 文件),指定并将依赖库添加到 repo 中。

编辑:

gradle 也不支持原生解析 pom 文件。所以你不能直接引用 pom 文件来识别依赖关系。但是,它将与识别依赖项的存储库一起使用(并且这些存储库可以使用 pom 文件,但 gradle 不解析它们)。在此处查看文档:https://docs.gradle.org/current/userguide/dependency_management.html

另外,请参阅有关 gradle 不支持解析 pom 文件的相关问题:Reading info from existing pom.xml file using Gradle?

【讨论】:

  • 是的,我完全明白你的意思,如果你仔细观察我的问题,我有以下内容“我认为它与 pom 文件的生成有关,在 pom 文件中你可以定义依赖部分. 我们如何让 gradle 知道在生成 pom 文件时包含依赖项?”
  • gradle 不支持解析 pom 文件 - 请参阅我的编辑。
  • 是的,如果 gradle maven 插件支持生成依赖项,我用谷歌搜索了,但没有运气。我想我将不得不在我的父项目的构建文件中包含子模块的依赖项。
【解决方案2】:

终于找到了gradle生成带有依赖的pom的解决方案,在发布任务中添加以下内容:

        pom.withXml {
            def dependencies = asNode().appendNode('dependencies')
            configurations.getByName("_releaseCompile").getResolvedConfiguration().getFirstLevelModuleDependencies().each {
                def dependency = dependencies.appendNode('dependency')
                dependency.appendNode('groupId', it.moduleGroup)
                dependency.appendNode('artifactId', it.moduleName)
                dependency.appendNode('version', it.moduleVersion)
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多