【发布时间】:2014-01-07 17:27:25
【问题描述】:
考虑以下多项目构建脚本:
build.gradle
subprojects {
apply plugin: 'java'
apply plugin: 'maven'
group = "myorg"
version = "1.0.0-SNAPSHOT"
}
project(':client') {
dependencies {
compile 'myorg:shared:1.0.0-SNAPSHOT'
}
}
包含以下文件:
├── build.gradle
├── client
│ └── src
│ └── main
│ └── java
│ └── myorg
│ └── client
│ └── MyOrgClient.java
├── settings.gradle
└── shared
└── src
└── main
└── java
└── myorg
└── shared
└── MyOrgObj.java
在上面的文件中 MyOrgClient.java 包含 myorg.shared.MyOrgObj 并且 settings.gradle 有单行 include 'client', 'shared'
问题
Maven 相关任务(例如本地安装和部署到远程存储库)的项目/任务构建顺序不考虑隐含的项目依赖关系。因为 gradle 不知道'myorg:shared:1.0.0-SNAPSHOT' 是由project(':shared') 创建的,所以构建顺序为:client -> :shared 并导致如下错误:
$ gradle install
:client:compileJava
FAILURE: Build failed with an exception.
* What went wrong:
Could not resolve all dependencies for configuration ':client:compile'.
> Could not find myorg:shared:1.0.0-SNAPSHOT.
Required by:
myorg:client:1.0.0-SNAPSHOT
问题: 有没有标准的方法来处理这个问题?我尝试了这些解决方案但没有成功:
- 使用
mustRunAfter,但遇到了尚不存在的任务的问题。我也认为这不适用于大量项目 - 将
archives project(':shared')添加到客户端的依赖项中 - 将
compile project(':shared')添加到客户端的依赖项,然后从生成的 pom.xml 中删除它。不幸的是,这不会将依赖项添加到安装任务或 artifactoryPublish编辑: 这实际上是解决方案。项目依赖将在生成的 pom.xml 中提供正确的版本/名称/组,因此不需要显式的 group:name:version 依赖
【问题讨论】: