拆分项目文件

到目前为止,您定义的多项目构建仅包含一个 build.gradle 文件和 settings.gradle 文件。 当您向 build.gradle 文件添加新的子项目和任务时,代码的可维护性将会受到影响。 必须费力地浏览一页又一页的代码来扩展或修改您的构建逻辑,这并不有趣。 您可以通过为每个项目创建单独的 build.gradle 文件来进一步推动关注点分离。

为每个项目创建构建文件

您将从设置构建基础设施开始。 对于每个子项目,您需要使用默认命名约定创建一个构建文件。 以下目录树显示了最终结果:

.
├── build.gradle
├── settings.gradle  // 根项目构建文件
├── model
│     ├── build.gradle //子项目单独构建文件
│     └── src
│           └── ...
├── repository
│     ├── build.gradle
│     └── src
│           └── ...
└── web
      ├── build.gradle
      └── src
            └── ...

项目文件就位后,您现在可以将构建逻辑从主构建文件中分离出来,并将其移动到适当的位置。

定义根项目的构建代码

allprojects {
    group = 'com.manning.gia'
    version = '0.1'
}

subprojects {
    apply plugin: 'java'
}

其余代码将被移至子项目的构建文件中。 接下来,我们将专注于定义子项目的构建逻辑。

定义子项目的构建代码

请记住,model 子项目没有定义任何特定于项目的构建逻辑。 事实上,您甚至不必声明项目配置块。 因此,您不必在子项目的 build.gradle 文件中声明任何代码。 Gradle 知道子项目是多项目构建的一部分,因为您将其包含在设置文件中。

子项目 repository 和 Web 的构建文件不会引入任何新代码。 您只需将现有的项目配置块复制到正确的位置即可。 每个项目都有一个专用的 Gradle 文件表明您正在处理一个特定的项目。 因此,将代码封装到项目闭包中成为可选的。 以下清单显示了存储库子项目的构建文件的内容。

清单 6.8 存储库子项目的 build.gradle 文件
dependencies {
    compile project(':model')
}

子项目 Web 的 build.gradle 文件应该看起来同样熟悉,如下一个清单所示。

清单 6.9 web 子项目的 build.gradle 文件
apply plugin: 'war'
apply plugin: 'jetty'

repositories {
    mavenCentral()
}

dependencies {
    compile project(':repository')
    providedCompile 'javax.servlet:servlet-api:2.5'
    runtime 'javax.servlet:jstl:1.1.2'
}

运行此多项目构建会产生与在一个主构建文件中具有相同代码的相同结果。 从好的方面来说,您显着提高了构建代码的可读性和可维护性。 在下一节中,我将进一步讨论一些自定义项目的示例。