Gradle多项目构建

关于项目模块化:

在企业项目中,包层次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,比如把业务逻辑层和数据持久化层拆分开来。项目符合高内聚低耦合时,模块化就变得很容易,这是一条非常好的软件开发实践

通常在使用Maven构建项目的时候,我们会将一个项目划分为多个模块,然后通过父工程去管理子模块。而 Gradle 也拥有类似的功能,我们将其称之为多项目构建(multi-project build)。所以本小节我们来看看,如何使用 Gradle 进行多项目构建,首先创建一个Gradle工程,过程如下:
Gradle多项目构建与jar包发布

自定义GroupId和ArtifactId:
Gradle多项目构建与jar包发布

选择本地的Gradle:
Gradle多项目构建与jar包发布

项目创建完成后,目录结构如下:
Gradle多项目构建与jar包发布

build.gradle构建脚本的内容如下:

plugins {
    id 'java'
}

group 'org.zero.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

setting.gradle文件的内容如下:

rootProject.name = 'gradle-model'

然后在gradle-model基础上创建多个模块,和创建gradle项目是一样的,这里以 dao 、pojo 和 service 模块为例。创建好后工程目录结构如下:
Gradle多项目构建与jar包发布

注:父工程的src目录可以删除掉

从上图中可以看到子模块中是没有setting.gradle文件的,而此时父工程的setting.gradle文件的内容如下:

rootProject.name = 'gradle-model'
include 'dao'
include 'service'
include 'pojo'

不难看出,gradle的setting.gradle文件导入了子模块,所以它用来管理父工程包含哪些子模块

此时,我们会发现父工程与子模块的build.gradle构建脚本的内容都是一样的,如下:
Gradle多项目构建与jar包发布

subprojects 方法可以设定所有子模块共享的配置,例如:所有模块都引入 java 插件、 repositories中配置的仓库以及依赖包和版本等。这样我们就可以将一些配置复用起来,那么就不需要每个子模块的build.gradle里都写一样的配置了。如下:
Gradle多项目构建与jar包发布

pojo模块因为不需要依赖外部的jar包,所以复用父工程的配置后可以留空,而dao依赖于pojo,所以需要单独配置一下依赖,service也是同理。gradle子模块引用另一个子模块时,需要使用project方法,与引用外部依赖是不同的。


将项目发布到本地Maven仓库

在上一小节中,我们完成了最简单的多项目构建,本小节则介绍一下如何将项目发布到本地的Maven仓库中,这也是比较常见的需求。因为有些项目需要依赖别的项目,又没有搭建私服的情况下,就只能发布到本地仓库,然后在别的项目去依赖本地仓库中的jar包。Gradle发布项目到本地及远程Maven仓库的流程:
Gradle多项目构建与jar包发布

修改build.gradle构建脚本的内容如下,引用maven的发布插件:

// allprojects用于定义所有项目的配置
allprojects {
    apply plugin: 'maven-publish'
    apply plugin: 'java'

    sourceCompatibility = 1.8

    group 'org.zero.example'
    version '1.0-SNAPSHOT'

    repositories {
        mavenCentral()
    }

    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }

    publishing {
        publications {
            myPublish(MavenPublication){
                from components.java
            }
        }
    }
}

在构建脚本里引用了maven的发布插件后,此时gradle的控制台就会出现publishing选项,点击下图中的publishToMavenLocal即可发布到本地maven仓库中:
Gradle多项目构建与jar包发布

发布成功后,可以在本地仓库中查找到相应的目录:
Gradle多项目构建与jar包发布

以及jar包:
Gradle多项目构建与jar包发布

如果需要发布到私服上的话,可以配置私服地址,如下示例:

publishing {
    publications {
        myPublish(MavenPublication){
            from components.java
        }
    }
    repositories {
        maven {
            url 'http://example.com' 
        }
    }
}

然后点击publishing选项下的publish就可以进行发布了,但由于我这里没有现成的私服,就不对此做演示了