我有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存储库。
发布于 2018-11-04 08:20:47
看看下面的方法是否有帮助。它假设一个由以下三个模块组成的项目:
Top-level
├── Project-1
├── Project-2
└── Project-3...and不同版本的番石榴在您已经描述过的设置中承担了Module-A的角色。
build.gradle 顶级
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的
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的
archivesBaseName = 'project2'
repositories {
mavenCentral()
}
dependencies {
implementation "com.google.guava:guava:[${project2GuavaVersions.join(',')}]"
}(类似于项目-1)
build.gradle 项目-3的
archivesBaseName = 'project3'
repositories {
mavenCentral()
}
dependencies {
implementation project(':project1')
implementation project(':project2')
implementation "com.google.guava:guava:$project3GuavaVersion"
}项目-1和项目-2被定义为项目级别的依赖项,这里使用了作为额外属性定义的番石榴显式计算版本。
我希望这涵盖了一切。如果没有别的,我希望它能激发一些新的想法!
更新
正如您在注释中提到的,您的项目不是按层次设置的,您还可以选择将它们设置为“平面”安排,其中所有项目都位于相同的文件夹深度,如下所示:
(root)
├── project1
│ └── build.gradle
├── project2
│ └── build.gradle
├── project3
│ └── build.gradle
└── master
├── build.gradle
└── settings.gradle“主人”这里是一个特别命名的项目,与其他项目并列。settings.gradle应该被移动到master中,并且应该使用Settings.includeFlat()来指示您希望包含作为相同级别存在的项目:
includeFlat 'project1'
includeFlat 'project2'
includeFlat 'project3'我最初提出的解决方案的细节应该适用于此设置。
https://stackoverflow.com/questions/53126180
复制相似问题