Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Gradle中创建可传递的分层多项目?_Gradle_Build.gradle - Fatal编程技术网

如何在Gradle中创建可传递的分层多项目?

如何在Gradle中创建可传递的分层多项目?,gradle,build.gradle,Gradle,Build.gradle,我使用Gradle已经有一段时间了,但从未深入研究过它的许多特性和功能,但前几天我决定将我的Java项目分成两个模块,以便于测试和维护。在我完成之后,我开始阅读关于和一个叫做Gradle的新概念。然后,我花了一天中大部分的时间试图将这些知识(我认为我理解的)应用到我的项目模块化上。可以肯定的是,我没有成功,现在我请求帮助理解这些概念及其应用 理论工作空间 假设我们有以下目录结构: toolbox | ├── first-tool | └── build.gradle | ├── second

我使用Gradle已经有一段时间了,但从未深入研究过它的许多特性和功能,但前几天我决定将我的Java项目分成两个模块,以便于测试和维护。在我完成之后,我开始阅读关于和一个叫做Gradle的新概念。然后,我花了一天中大部分的时间试图将这些知识(我认为我理解的)应用到我的项目模块化上。可以肯定的是,我没有成功,现在我请求帮助理解这些概念及其应用

理论工作空间 假设我们有以下目录结构:

toolbox
|
├── first-tool
|   └── build.gradle
|
├── second-tool
|   └── build.gradle
|
├── build.gradle
└── settings.gradle
这些是根目录中的项目:

Root project 'toolbox'
+--- Project ':first-tool'
\--- Project ':second-tool'
让我们让project
first 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
第一个工具
不再继承
工具箱
的属性,基本上不再是
工具箱
的子项目

项目目标 我很可能误解了复合构建的整个概念,或者只是犯了一些愚蠢的错误。无论哪种方式,我想知道的是,是否有任何方式可以使子项目相互依赖,从而形成分层的多项目结构

就目前情况而言,我必须在以下两者之间做出选择:

  • 一个常规的多项目构建,其中所有内容都整洁有序,我的所有子项目都共享来自顶层项目的相同定义
  • 我可以自由创建项目间依赖关系的复合构建
如果能够有一个main
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
implement
first tool
,但实际上你的方法更好。直接从实际需要它的构建中实现它更有意义。