如何在Gradle中创建可传递的分层多项目?
我使用Gradle已经有一段时间了,但从未深入研究过它的许多特性和功能,但前几天我决定将我的Java项目分成两个模块,以便于测试和维护。在我完成之后,我开始阅读关于和一个叫做Gradle的新概念。然后,我花了一天中大部分的时间试图将这些知识(我认为我理解的)应用到我的项目模块化上。可以肯定的是,我没有成功,现在我请求帮助理解这些概念及其应用 理论工作空间 假设我们有以下目录结构:如何在Gradle中创建可传递的分层多项目?,gradle,build.gradle,Gradle,Build.gradle,我使用Gradle已经有一段时间了,但从未深入研究过它的许多特性和功能,但前几天我决定将我的Java项目分成两个模块,以便于测试和维护。在我完成之后,我开始阅读关于和一个叫做Gradle的新概念。然后,我花了一天中大部分的时间试图将这些知识(我认为我理解的)应用到我的项目模块化上。可以肯定的是,我没有成功,现在我请求帮助理解这些概念及其应用 理论工作空间 假设我们有以下目录结构: toolbox | ├── first-tool | └── build.gradle | ├── second
toolbox
|
├── first-tool
| └── build.gradle
|
├── second-tool
| └── build.gradle
|
├── build.gradle
└── settings.gradle
这些是根目录中的项目:
Root project 'toolbox'
+--- Project ':first-tool'
\--- Project ':second-tool'
让我们让projectfirst tool
引入一个外部依赖项org.master toolbox:some.other.tool
,第二个工具箱依赖于它,但它本身并不实现:
default - Configuration for default artifacts.
+--- org.master-toolbox:some.other.tool:1.0
| +--- ...
\--- io.toolbox:first-tool
以下是相关的Gradle文件:
设置。渐变
rootProject.name = 'toolbox'
include 'first-tool', 'second-tool'
allprojects {
apply plugin: 'java-library'
group = "io.toolbox"
repositories {
jcenter()
}
}
dependencies {
// This is an external dependency that is resolved through jcentral
implements 'org.master-toolbox:some.other.tool:1.0'
}
dependencies {
// Try to implement first-tool build to inherit dependencies
implementation 'io.toolbox:first-tool'
}
toolbox.build.gradle
rootProject.name = 'toolbox'
include 'first-tool', 'second-tool'
allprojects {
apply plugin: 'java-library'
group = "io.toolbox"
repositories {
jcenter()
}
}
dependencies {
// This is an external dependency that is resolved through jcentral
implements 'org.master-toolbox:some.other.tool:1.0'
}
dependencies {
// Try to implement first-tool build to inherit dependencies
implementation 'io.toolbox:first-tool'
}
第一个工具.build.gradle
rootProject.name = 'toolbox'
include 'first-tool', 'second-tool'
allprojects {
apply plugin: 'java-library'
group = "io.toolbox"
repositories {
jcenter()
}
}
dependencies {
// This is an external dependency that is resolved through jcentral
implements 'org.master-toolbox:some.other.tool:1.0'
}
dependencies {
// Try to implement first-tool build to inherit dependencies
implementation 'io.toolbox:first-tool'
}
第二个工具.build.gradle
rootProject.name = 'toolbox'
include 'first-tool', 'second-tool'
allprojects {
apply plugin: 'java-library'
group = "io.toolbox"
repositories {
jcenter()
}
}
dependencies {
// This is an external dependency that is resolved through jcentral
implements 'org.master-toolbox:some.other.tool:1.0'
}
dependencies {
// Try to implement first-tool build to inherit dependencies
implementation 'io.toolbox:first-tool'
}
如上所示,上面生成了一个很好的项目结构,但无法完全工作,因为第二个工具
找不到第一个工具
,并且控制台中会出现类似于以下错误的内容:
> Could not resolve all files for configuration ':second-tool:compileClasspath'.
> Could not find io.toolbox:first-tool:.
Required by:
project :second-tool
现在据我所知,这就是复合构建的突飞猛进之处,通过允许我们包含整个构建来节省时间。听起来不错,让我们更新一下设置。gradle:
rootProject.name = 'toolbox'
includeBuild `first-tool`
include 'second-tool'
现在项目构建和编译都正常了,一切都很好,对吗?不完全是这样,因为在我们的设置中使用includebild
关键字。gradle
第一个工具
不再继承工具箱
的属性,基本上不再是工具箱
的子项目
项目目标
我很可能误解了复合构建的整个概念,或者只是犯了一些愚蠢的错误。无论哪种方式,我想知道的是,是否有任何方式可以使子项目相互依赖,从而形成分层的多项目结构
就目前情况而言,我必须在以下两者之间做出选择:
- 一个常规的多项目构建,其中所有内容都整洁有序,我的所有子项目都共享来自顶层项目的相同定义
- 我可以自由创建项目间依赖关系的复合构建
build.gradle
驻留在顶部项目的根目录中,并为整个层次结构定义公共插件、存储库、组等,那就太好了。其他项目将拥有自己的build.gradle
文件,这些文件将赋予他们独特的属性,但将从顶层项目执行任务
我已经阅读了关于这个主题的官方文档,因此我正在寻找关于如何实现这个特定目标的更具体的解释和指导。对于多模块构建,一个模块可以依赖于另一个模块。要使第二个项目依赖于第一个项目,请将
第二个工具/build.gradle
编辑为:
dependencies {
implementation project(':first-tool')
}
此外,第一个模块可能是:
dependencies {
api 'org.master-toolbox:some.other.tool:1.0'
}
您可以使用多模块构建来完成您描述的工作;您可以具有模块间依赖关系,并且可以通过使用
allprojects{…}
或subprojects{…}
从顶层构建配置模块
复合构建很少使用——如果您对“单一”构建感到满意,并且不需要将代码拆分为不同的repo。等等,然后进行(普通)多模块构建。这可能会有所帮助:@Henry谢谢,我已经读过了,并且熟悉
api
和implementation
关键字`之间的区别。我昨天设法解决了这个问题,我的方法是从toolbox
(根项目)制作second tool
implementfirst tool
,但实际上你的方法更好。直接从实际需要它的构建中实现它更有意义。