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

标签 java gradle build.gradle

我的公司目前正在将其 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/

相关文章:

android - ionic Cordova 运行Android给出gradle错误

java - Java游戏音效无法正常工作

java - 在 Java 中识别方法内部的调用者

java - 禁用序列化缓存

android - 导入项目后Gradle无法同步并显示错误

intellij-idea - Gradle包含不同父项上的项目

java - Java中的非阻塞连接

gradle - Gradle显示子项目的编译配置的内容

android - 执行过去迭代备份时出现异常 : Source

intellij-idea - Gradle Idea 插件 - 目录作为项目库