首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理Gradle中的传递依赖关系版本

管理Gradle中的传递依赖关系版本
EN

Stack Overflow用户
提问于 2018-11-02 21:45:44
回答 1查看 729关注 0票数 2

我有3个项目:项目1,项目2,项目3。Project-1和Project-2是Java库,Project-3是这些库的使用者。项目1和项目2都依赖于模块A。但是,对于其中的每一个,我都希望能够指定一个与它们兼容的确切版本列表。例如,Project-1兼容模块-A,版本1和2,但Project-2兼容模块-A,版本2和3。我希望能够在每个项目的构建配置中指定这些要求。这些依赖项只能是影响元素,甚至可以是compileOnly。

当Project-3使用由Project-1和Project-2构建的库时,我希望确保模块-A被解析为在Project-1和Project-2中显式列出的最新版本。否则,我希望在构建步骤中得到一个错误,即无法找到令人满意的依赖解决方案。理想情况下,我希望能够显式指定项目3级构建中模块A的版本,如果它与任何一个Project-1或Project-2不兼容,就会收到错误。

使用Maven插件从本地Maven存储库使用Project-1和Projec-2构件并将其上载到本地Maven存储库。

EN

回答 1

Stack Overflow用户

发布于 2018-11-04 08:20:47

看看下面的方法是否有帮助。它假设一个由以下三个模块组成的项目:

代码语言:javascript
复制
Top-level
├── Project-1
├── Project-2
└── Project-3

...and不同版本的番石榴在您已经描述过的设置中承担了Module-A的角色。

build.gradle 顶级

代码语言:javascript
复制
ext {
  project1GuavaVersions = ['26.0-jre','27.0-jre']
  project2GuavaVersions = ['25.0-jre','26.0-jre']

  if(project1GuavaVersions.disjoint(project2GuavaVersions)) {
    throw new GradleException('No common version(s) of Guava defined')
  } else {
    project3GuavaVersion = new HashSet(project1GuavaVersions + project2GuavaVersions).max()
  }

subprojects {
  apply plugin: 'java'
}

用于为每个模块指定可接受的番石榴版本的额外属性。项目-3的版本计算为项目-1和项目-2之间使用的最新版本。(此外,为了方便起见,将Java插件应用于这三个子项目)。

build.gradle 项目-1的

代码语言:javascript
复制
archivesBaseName = 'project1'

repositories {
  mavenCentral()
}

dependencies {
  implementation "com.google.guava:guava:[${project1GuavaVersions.join(',')}]"
}

Project-1的Guava版本的额外属性被内插并从字符串列表转换为逗号分隔的字符串。这使用Gradle的能力使用常春藤符号来指定一系列版本,即[26.0-jre,27.0-jre]

build.gradle 项目-2的

代码语言:javascript
复制
archivesBaseName = 'project2'

repositories {
  mavenCentral()
}

dependencies {
  implementation "com.google.guava:guava:[${project2GuavaVersions.join(',')}]"
}

(类似于项目-1)

build.gradle 项目-3的

代码语言:javascript
复制
archivesBaseName = 'project3'

repositories {
  mavenCentral()
}

dependencies {
  implementation project(':project1')
  implementation project(':project2')
  implementation "com.google.guava:guava:$project3GuavaVersion"
}

项目-1和项目-2被定义为项目级别的依赖项,这里使用了作为额外属性定义的番石榴显式计算版本。

我希望这涵盖了一切。如果没有别的,我希望它能激发一些新的想法!

更新

正如您在注释中提到的,您的项目不是按层次设置的,您还可以选择将它们设置为“平面”安排,其中所有项目都位于相同的文件夹深度,如下所示:

代码语言:javascript
复制
(root)
├── project1
│   └── build.gradle
├── project2
│   └── build.gradle
├── project3
│   └── build.gradle
└── master
    ├── build.gradle
    └── settings.gradle

“主人”这里是一个特别命名的项目,与其他项目并列。settings.gradle应该被移动到master中,并且应该使用Settings.includeFlat()来指示您希望包含作为相同级别存在的项目:

代码语言:javascript
复制
includeFlat 'project1'
includeFlat 'project2'
includeFlat 'project3'

我最初提出的解决方案的细节应该适用于此设置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53126180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档