当前位置: 首页 > 知识库问答 >
问题:

如何在多模块Android Gradle项目中设置依赖项?

储毅
2023-03-14

我如何在一个Android Gradle项目中设置模块的依赖关系,在这个项目中,模块之间相互依赖,这样我就可以一次部署所有模块的新快照或发布版本的构建?

该项目的结构如下:

/my-project-name
|
|--/lib-core
|  |-- build.gradle
|  |-- gradle.properties
|
|--/lib-help
|  |-- build.gradle
|  |-- gradle.properties
|
|-- build.gradle
|-- gradle.properties
|-- settings.gradle
|-- gradle-mvn-push.gradle

项目配置文件如下,仅显示相关部分(根据我的判断):

设置。分级:

include ':lib-core', ':lib-help'
GROUP=com.company
VERSION=5.0.0-SNAPSHOT
apply plugin: 'maven'

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                // GROUP is defined in <root>/gradle.properties
                pom.groupId = GROUP
                // ARTIFACT is defined in <root>/<module>/gradle.properties
                pom.artifactId = ARTIFACT
                // VERSION is defined in <root>/gradle.properties
                pom.version = VERSION
            }
        }
    }
}

// Contains a lot more to fill in other meta-data like project name,
// developer name, github url, javadoc, signing of the artifacts, etc, etc..
ARTIFACT=my-lib-core
apply plugin: 'com.android.library'

// Contains more code to configure the android stuff, not relevant for this question

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

apply from: rootProject.file('gradle-mvn-push.gradle')

lib-help/gradle.properties:

ARTIFACT=my-lib-help

lib-help/build.gradle:

apply plugin: 'com.android.library'

// Contains more code to configure the android stuff, not relevant for this question

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':lib-core')
}

apply from: rootProject.file('gradle-mvn-push.gradle')

当我运行gradlew clean:lib-core:uploadarchives:lib-help:uploadarchives时,所有内容都编译得很好,并且上载文件被推送到正确的存储库。在Nexus Repository Manager中,我可以看到这两个模块的工件具有正确的名称、版本、签名等,但是在生成的pom.xml中lib-help对lib-core的依赖是错误的。它将项目名用作groupId,将模块名用作artifactId和一个未指定的版本名:

<dependency>
    <groupId>my-project-name</groupId>
    <artifactId>lib-core</artifactId>
    <version>unspecified</version>
    <scope>compile</scope>
</dependency>

因此,使用lib-help作为依赖项的项目无法解析lib-core依赖项。应该在lib-help的pom.xml中的正确值是groupid=com.company、artifactid=my-lib-core和version=5.0.0-snapshot。

为了解决这个问题,我想我应该在lib-help中使用maven依赖项,而不是模块依赖项,如下所示:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.company:my-lib-core:' + VERSION
}

当然,在执行lib-core的uploadArchives命令之前,这个版本并不存在,但是gradle希望在开始执行任何给定命令之前解决所有模块的依赖关系。因此,它无法解析这种依赖关系,并在配置gradle项目时出错退出。现在,我可以通过临时将lib-help的依赖关系设置为project(':lib-core'),然后释放lib-core,然后将lib-help的依赖关系调整为'com.company:my-lib-core:5.0.0-snapshot',然后释放lib-help,但这似乎不是正确的方法。它会招致人为错误(如果我不小心在to uploadArchives命令之间增加了版本号怎么办?)它需要几个手工的、严格有序的步骤。

我如何在一个Android Gradle项目中设置模块的依赖关系,在这个项目中,模块之间相互依赖,这样我就可以一次部署所有模块的新快照或发布版本的构建?(例如,gradlew clean:lib-core:uploadarchives:lib-help:uploadarchives)

共有1个答案

卓新知
2023-03-14

如果在上载之前重写POM,则可以保留本地项目依赖项(compile project(':core')):

afterEvaluate { project ->
  uploadArchives {
    repositories {
      mavenDeployer {
        // ... other config here ...

        pom.whenConfigured { pom ->
          pom.dependencies.forEach { dep ->
            if (dep.getVersion() == "unspecified") {
              dep.setGroupId(GROUP)
              dep.setVersion(VERSION_NAME)
            }
          }
        }
      }
    }
  }
}

下面是一个正在工作的项目的示例:https://github.com/hannesstruss/windfish

 类似资料:
  • Gradle 项目可以通过多项目配置依赖于其它 Gradle 项目。通常使用多项目配置会将所有库项目(如 lib1、lib2)添加到指定的根项目(如 libraries)。例如,给定以下项目结构: MyProject/ + app/ + libraries/ + lib1/ + lib2/ 我们可以找出3个项目。Gradle 将会按照以下名字进行映射: :app :librar

  • 问题内容: 我试图弄清楚Maven多模块项目中的所有依赖项。首先,我使用appfuse创建了一个新的spring mvc多模块项目。它最初具有Web和核心模块。 我发现了部署此项目的知识。但是当我遇到错误时。我总是在哪里添加依赖项或插件感到困惑。我想澄清以下问题。 我创建了一个appfuse mvc多模块项目。我先安装了核心,然后在网上进行了maven jetty7:run(最初我在根文件夹上运行

  • 我有一个多模块Spring引导梯度项目。我在每个模块yml文件中都有指向数据库的属性:user、pass、URL。 这是一个可行的解决方案,但很难改变项目数据库。每次我想切换数据库用户或url,我必须改变10+yml文件。 如何避免这一点?

  • 我正在使用STS 2.9.1(构建在Eclipse 3.7.2上)和与STS(V1.0.200.20111228-1245)绑定的m2e插件。 我有一个问题是包含多个模块的Eclipse项目中缺少依赖项,或者我不完全理解它应该如何工作。 这是一个maven项目。 在我的项目>Properties>Java Build Path>Libraries中,我有“maven dependencies”库,

  • 在使用Maven一段时间后,我对Maven在构建体系结构中带来的许多特性感到兴奋,尤其是依赖项管理。然而,我一次又一次地遇到了一个问题--Maven如何解决多模块项目之间的依赖关系。我想知道这是否是当前Maven实现的大缺陷和/或是否有任何令人满意的解决方案。 假设我有一个多模块的Maven项目。父pom包含三个模块--moduleA(jar)、moduleB(jar)和moduleC(war)。

  • 我有一个关于Maven依赖解析机制如何在多模块项目中工作的问题。 通常,我只在构建多模块项目时使用“mvn clean install”,我的假设是,如果项目中的任何模块需要以前的模块,依赖关系将通过访问本地存储库并加载相应的“jar”来解决。 由于项目内部原因,我必须使用“mvn清洁编译”,这个命令自然不会创建任何“jar”,而“install”不存在。所以在这里我开始想知道,多模块项目的依赖项