当前位置: 首页 > 知识库问答 >
问题:

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

廖招
2023-03-14

我已经使用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'

让我们使项目第一工具引入一个外部依赖项org.master工具箱:some.other.tool第二个工具箱依赖于它但不实现它自己:

default - Configuration for default artifacts.
+--- org.master-toolbox:some.other.tool:1.0
|    +--- ...
\--- io.toolbox:first-tool

这些是相关的Gradle文件:

settings.gradle

rootProject.name = 'toolbox'

include 'first-tool', 'second-tool'

工具箱.build.gradle

allprojects {

    apply plugin: 'java-library'

    group = "io.toolbox"

    repositories {
        jcenter()
    }
} 

第一个工具.build.gradle

dependencies {
    // This is an external dependency that is resolved through jcentral
    implements 'org.master-toolbox:some.other.tool:1.0'
}

second-tool.build.gradle

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

现在,据我所知,这就是复合构建应该出现的地方,通过允许我们包含整个构建来节省时间。听起来不错,让我们更新一下<code>设置。gradle</code>:

rootProject.name = 'toolbox'

includeBuild `first-tool`
include 'second-tool'

现在项目构建和编译正确,一切都很好吧?不完全是,因为在我们的设置中使用includeBuild关键字.gradle第一个工具不再从工具箱继承属性,并且基本上不再是工具箱的子项目

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

就目前而言,我必须在以下选项之间进行选择:

  • 一个常规的多项目构建,其中一切都井井有条,我的所有子项目都与顶级项目共享相同的定义。
  • 一个复合构建,我可以在其中自由创建项目间依赖项。

如果能有一个main<code>构建,那就太好了。gradle,它位于顶级项目的根目录中,并为整个层次结构定义通用插件、存储库、组等。其他项目将拥有自己的构建。gradle文件,该文件将为它们提供唯一的属性,但将从顶级项目执行它们的任务。

我已经阅读了关于这个主题的官方文件,所以我正在寻找关于如何实现这个具体目标的更具体的解释和指导。

共有1个答案

苏嘉志
2023-03-14

使用多模块构建,一个模块可以依赖于另一个模块。要让第二个项目依赖于第一个项目,请将第二个工具/build.gradle编辑为:

dependencies {
    implementation project(':first-tool')
}

此外,第一个模块可能应该是:

dependencies {
    api 'org.master-toolbox:some.other.tool:1.0'
}

您可以使用多模块构建来执行您所描述的操作;您可以具有模块间依赖关系,并且可以使用all项目{…}子项目{…}从顶层构建配置模块。

复合构建很少使用——如果你喜欢“单一的”构建,并且不需要将你的代码分成不同的repos。等等。,然后选择(简单的)多模块构建。

 类似资料:
  • 我有多个java项目。这些项目正在使用Gradle创建jar、war和ear文件。在每个项目中,我都使用清单文件来维护元数据,如版本、日期-时间...为此,我在每个build.gradle文件中都包含了清单文件创建逻辑。 但在Gradle中有一个特性调用SharedManifest。我在主项目build.gradle脚本中定义了以下两个任务。但是在每个jar和war文件中都有gradle创建的默认

  • 我使用的是Eclipse BuildshipV2.1.2用于Gradle。我有两个独立的web项目,P1和P2,还有一个项目,P3,它作为所有其他项目的依赖项。我的任务是创建一个主构建,用它可以从P1和P2构建和生成WAR文件,并从P3生成JAR文件。我应该包含这个P3 jar文件作为P1和P2的依赖项。我创建了一个, null P2 Build.Gradle settings.gradle Bu

  • 给予 这在gradle 1.3中无法正常工作。(即,子项目包含所有依赖项) 这是一个bug还是有不同的语法来排除项目依赖关系?

  • 我有一个库,我称之为,它是另一个项目的依赖项,名为。在的构建中。gradle,我正在使用,它以如下方式指定为依赖项: 这很有效-已编译。但是,当我在我的项目中使用它时,我得到了以下内容: <code>生成。的gradle如下所示: 可能这是因为库在,但它没有正确的位置来搜索Maven存储库。有没有一种方法可以使这些搜索位置以及依赖关系本身变得短暂?

  • 我在代理“客户”群体中用Anylogic创建了一个时间表,客户必须创建订单并将其发送到“终端”。每天,每个客户必须发送到终端的订单量都是不同的。我想一次创建多个订单(每天,即计划中的开始列),我想创建的金额是计划中的值列。如何做到这一点? 正如您在下面看到的,现在每天只创建一个订单(以金额为参数),但我想在那一天/那一刻创建这个订单量。谢谢您的帮助! 日程数据如下所示:

  • 考虑这个例子 我有一个函数,它以作为输入,并返回三个值,我想存储到三个不同的变量。下面的似乎工作正确 然而,当我试图创建相应的变量时,我得到了一个错误 你怎么认为? 我曾经在pandas apply()的返回多列中使用伟大的解决方案,但在当前的pandas中,此解决方案不再有效 谢谢!