gpt4 book ai didi

java - Gradle多项目,如何处理不同的rootDirs

转载 作者:行者123 更新时间:2023-11-30 02:36:24 25 4
gpt4 key购买 nike

我的公司目前正在将其 Java 项目从 Ant 切换到 Gradle,但我仍然坚持一个很好的干净设置。假设我在一家为客户构建网站的公司工作,这些网站通常使用相同的根库(核心项目),但有一些特定的代码,这些代码放在子项目中。每个客户,我们都会构建一个新的子项目,该子项目取决于核心项目。 future 客户数量还会增加。

目前我们有三个项目:

  • 核心项目。这应该单独运行,因为我们希望能够为此单独进行单元测试。
  • 两个依赖于核心项目的子项目,但有一些特定于该项目的自己的项目。

我成功地将整个 ant 构建转换为核心项目的 gradle 构建。我的想法是把所有功能和项目结构都放在核心中,只保留子项目中实际需要的额外内容。

这是我们文件夹结构的简短示例:

-- core
- build.gradle
- settings.gradle
-- repository (our external jars used)
-- Implementation
-- source_code
-- all the core project folders
-- Projects
-- Client A
- build.gradle
- settings.gradle
-- more project specific folders
-- Client B
- build.gradle
- settings.gradle
-- more project specific folders

我经常使用 $rootDir 变量。核心的 settings.gradle 的一部分如下所示:

project(':CoreProjectA').projectDir = new File(rootDir, 'Implementation/Source_code/Core/coreA')
project(':CoreProjectB').projectDir = new File(rootDir, 'Implementation/Source_code/Core/CoreB')

但还有更多。另外,在核心 build.gradle 中,我这样引用我们的存储库:

repositories {
//All sub-projects will now refer to the same 'libs' directory
flatDir {
dirs "$rootDir/repository/lib/jaxb"
//many more dirs here
}
}

现在,当我从核心项目进行 gradle 构建时,这一切都非常有效。我计划将下一段代码放入每个客户的子项目 build.gradle 中:

apply from: '../../../build.gradle'

当我从 Client A 文件夹运行 gradle 构建时,我的 rootDir 显然已更改,现在,我的所有路径都无法在任何地方找到。

有什么方法可以以一种干净的方式进行设置吗?这样以后添加的每个子项目都可以始终使用相同的结构吗?或者我是否必须为每个子项目提供自己的 build.gradle 和 settings.gradle 完全?

我知道最后一个选项可以工作,但它的开销很大,而且对我来说一点也不漂亮和干净..

提前致谢!

最佳答案

我最近进行了类似的配置,所以让我解释一下如何构建 Gradle 基础设施。既然您提到了很多要求,我希望我不会遗漏其中任何一个,您可以将我的方案应用于您的问题。

一般

我们实际上使用构建系统(如 Gradle)来让它们处理任何依赖项(项目、模块、任务)。那么,如果我们可以简单地在 Gradle 中定义依赖关系,为什么我们要在文件系统层次结构之类的东西中定义依赖关系呢?

我会尽可能避免使用路径(约定优于配置),并尝试坚持使用 Gradle 项目来构建脚本和依赖项。

此外,如果您在核心 gradle.build 中定义依赖项,则应该只调用此 gradle 文件,即使您只想构建一个子项目。您的 apply from: '../../../build.gradle' 会破坏整个 Gradle 逻辑。相反,您应该使用诸如 gradle :sub1:build 之类的内容来仅构建第一个子项目。

第一种方法(以核心作为根项目)

文件系统结构:

core/
build.gradle
settings.gradle
src/
...
sub1/
src/
...
build.gradle [optional]
sub2/
src/
...
build.gradle [optional]

核心settings.gradle:

include 'sub1'
include 'sub2'

核心build.gradle:

allprojects {
apply plugin: 'java'

repositories {
// define repos for all projects
}
}

subprojects {
dependencies {
// let subprojects depend on core
compile rootProject
}
}

project(':sub1') {
// define anything you want (e.g. dependencies) just for this subproject
// alternative: use build.gradle in subproject folder
}

第二种方法(所有项目独立)

文件系统结构:

core/
src/
...
build.gradle [optional]
sub1/
src/
...
build.gradle [optional]
sub2/
src/
...
build.gradle [optional]
build.gradle
settings.gradle

settings.gradle:

include 'core'
include 'sub1'
include 'sub2'

根目录“build.gradle”

subprojects {
apply plugin: 'java'

repositories {
// define repos for all projects
}
}

configure(subprojects.findAll {it.name != 'core'}) {
dependencies {
// Add dependency on core for sub1 and sub2
compile project(':core')
}
}

project(':sub1') {
// define anything you want (e.g. dependencies) just for this subproject
// alternative: use build.gradle in subproject folder
}

这种方法提供了极大的灵 active ,因为每个依赖关系逻辑都由 Gradle 处理,您永远不必将任何内容复制到另一个位置。只需更改依赖关系就可以了。

来源

Gradle Tutorial on Multi-project Builds

Question in Gradle Forum

关于java - Gradle多项目,如何处理不同的rootDirs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42945488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com