gradle多项目构建和项目的发布

参考文档:

    https://www.jianshu.com/p/a0beddfbc91e
    https://www.jianshu.com/p/2bd487fbf5cf

一、gradle多项目构建

1.1、概念引入

  在企业中,一个比价复杂的项目往往是分成几个小项目来协同完成,这就涉及到多项目的构建,而多项目构建咱们需要先来学习一个概念叫"项目模块化".

  模块化是指将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能。

  在企业项目中,包和类比较多,关系也比较复杂,为了能够很好的管理和区分这些包和类,会把代码拆分成模块,按某些功能点清晰的划分边界.比如把业务逻辑和数据持久拆分,比如把所有的 domain 拆分成一个模块,或者大的划分,把前后台代码拆分成两个独立的模块.项目中的模块要符合高内聚低耦合思想.接下咱们来看下如何做多项目构建

1.2、多项目构建模块划分和依赖关系

  以下咱们以一个点评网站(comment)的搭建来做模块的划分和关系的搭建,模块划分和模块关系如下图:

模块划分
  项目划分为4个模块,架构如图所示,web 和 admin 需要依赖 core 和 model,core 需要依赖 model,由于传递性依赖的特点,咱们待会在配置依赖时可以只配置 core 依赖 model,web 和 admin 依赖 core 即可.

  有用过 Maven 或者其他构建工具的小伙伴都知道,不管一个项目分为几个模块,最终都需要有一个 root 项目来统一的管理所有的模块.对 Gradle 来说同样也不例外,以下咱们先来看下模块之间的关系以及 Gradle 构建脚本中的配置范围.

1.3、模块关系和构建脚本配置范围

脚本配置范围和项目关系

  所有划分出来的模块都是属于 root 项目的子模块,所有项目(包括 root 项目)的公用配置在 allprojects 中配置,所有子模块的公用配置可以在 subprojects 中来配置,build.gradle 针对项目的配置项都可以配置在 allprojects/subprojects 中.

1.4、项目和模块的创建

  这个好像没什么好说的,按照之前写到的创建普通 jar 项目和 web 项目的教程创建即可,创建完成后的效果如下:

项目创建后的样子
  由于父模块 comment 本身并不会有任何代码,所以我们可以手动删除相关的文件夹(src目录),删除后的效果:

在这里插入图片描述
  现在让我们看一下各个模块的配置文件信息:

  comment父工程的 settings.gradle 文件内容:

//	定义了工程的名称
rootProject.name = 'comment'
//	引入/定义子模块
include 'core'
include 'model'
include 'web'
include 'admin'

  comment父工程的 build.gradle 文件内容:

plugins {
    id 'java'
}

group 'org.milory'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

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

  core 和 model 模块的 build.gradle 文件内容(内容一样):

plugins {
    id 'java'
}

group 'org.milory'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

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

  admin 和 web 模块的 build.gradle 文件内容(内容一样):

plugins {
    id 'java'
    //	由于是 web 工程,所以要使用 war 插件
    id 'war'
}

group 'org.milory'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

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

  模块项目依赖后的配置:

  由于model 模块不需要依赖其它模块,所以model 模块的配置文件不需要修改

  由于core 模块需要依赖 model 模块,所以 build.gradle 文件配置如下:

........ 其它配置省略 ........
dependencies {
    compile project(":model")
    ................
}

  由于admin和 web 模块需要依赖 model 和 core 模块,但是core 模块已经依赖了 model 模块了,根据依赖的传递性,就不需要再依赖 model 模块了,所以 build.gradle 文件配置如下:

........ 其它配置省略 ........
dependencies {
    compile project(":core")
    ................
}

  然后看一下相关的 依赖信息:
模块依赖图

1.5、模块公共配置的抽取

  多项目的构建其实不仅仅是配置模块和模块之间的依赖关系就 ok 的,其实还涉及到通用配置的管理等,下面我们梳理一下通用的配置:

  • 1 所有的项目都需要使用 Java 插件,web 项目也需要依赖 Java 环境;
  • 2 web 子项目需打为 war 包;
  • 3 统一配置公共属性,例如: group,version;
  • 4 统一管理资源库
  • 5 通用依赖配置,例如 logback 日志功能的引入.

  统一资源库配置
    comment 的build.gradle 中将 repositories 移动到 allprojects 中,并删除所有子模块中的资源库配置项,配置如下:

allprojects {
    // 统一引入 java 插件、指定JDK版本指定
    apply plugin :"java"
    sourceCompatibility = 1.8

    // 仓库的配置
    repositories {
        mavenLocal()
        maven{
            url 'https://maven.aliyun.com/repository/public/'
        }
        mavenCentral()
    }
}

  统一属性配置
    将所有模块中的 group 和 version 统统配置在comment 的 build.gradle 的 allprojects/subprojects中,子模块删除.

allprojects {
    // 统一 group 和 version
    group 'org.milory'
    version '1.0-SNAPSHOT'
}

    以上是一种配置,咱们也可以给 project 配置属性,可用ext 来做拓展,也可用 gradle.properties 来配置。在 comment 下创建 gradle.properties 内容如下:

group=org.milory
version=1.0-SNAPSHOT

  统一依赖的配置
    在 comment 下 build.gradle 中的 allprojects 中配置 dependencies

allprojects {
    //  将公共的依赖抽取出来
    dependencies {
        compile 'ch.qos.logback:logback-classic:1.2.3'
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
}

  抽取后的配置如下
    comment 下 build.gradle 文件内容:

allprojects {
    // 统一引入 java 插件、指定JDK版本指定
    apply plugin :"java"
    sourceCompatibility = 1.8

    // 统一 group 和 version
    group 'org.milory'
    version '1.0-SNAPSHOT'

    // 仓库的配置
    repositories {
        mavenLocal()
        maven{
            url 'https://maven.aliyun.com/repository/public/'
        }
        mavenCentral()
    }

    //  将公共的依赖抽取出来
    dependencies {
        compile 'ch.qos.logback:logback-classic:1.2.3'
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
}

     model 模块下 build.gradle 文件内容为空

     core 模块下 build.gradle 文件内容:

dependencies {
    compile project(":model")
}

     admin 和 web 模块下 build.gradle 文件内容:

plugins {
    id 'war'
}

dependencies {
    compile project(":core")
}

1.6、特点总结

  • 1、comment 配置公共的依赖和属性
  • 2、其它子模块只需要配置其独自特殊的配置即可
  • 3、构建单独子模块只需要构建本身和其依赖的模块即可
  • 4、构建 comment 项目会构建所有模块项目

二、gradle项目发布

  项目发布可以将咱们写好的模块发布给别人去使用,也可以发布到公司的公共仓库以供依赖的项目使用.这是公司中多项目协同合作的重要环节.以下是Gradle 发布项目流程:

在这里插入图片描述

  • 1、由 Gradle 将项目打包和创建 metadata 文件
  • 2、按要求发布到本地仓库或者远程仓库

  这是发布的流程,也是待会咱们需要 gradle 帮咱们做的事情.

2.1、Gradle 项目发布实现

  操作步骤

    1、添加 maven-publish 插件
    2、配置发布任务
    3、执行发布
      3.1、发布到远程私服
      3.2、发布到本地仓库
      3.3、发布到 maven 中央仓库

2.2、构建文件配置

  在 build.gradle 中添加如下配置:

apply plugin :'maven-publish'

publishing {
    publications {
        // publishProject 为自定义名称,可写多个发布任务
        publishProject(MavenPublication){
             from components.java  // 发布 jar 包
             //from components.war  // 发布 war 包
        }
    }
    // 配置发布到哪里
    repositories {
        maven {
            //指定要上传的 maven 私服仓库
            url = ""
            //认证用户和密码
            credentials {
                username 'root'
                password 'admin'
            }
        }
    }
}

2.3、gradle 的发布任务

  task 任务截图如下:
在这里插入图片描述
  task任务详解:

  • 1、generateMetadataFileForPublishProjectPublication ==> 生成metaData 文件
  • 2、generatePomFileForPublishProjectPublication ==> 生成pom 文件
  • 3、publish ==> 发布到 repositories 中指定的仓库(一般为 Maven 私服)
  • 4、publishAllPublicationsToMavenRepository ==> 发布所有到Maven仓库
  • 5、publishPublishProjectPublicationToMavenLocal ==> ??
  • 6、publishPublishProjectPublicationToMavenRepository==> ??
  • 7、publishToMavenLocal ==> 执行所有发布任务中的操作发布到本地 maven 仓库

   generateMetadataFileForPublishProjectPublication 和 generatePomFileForPublishProjectPublication 任务生成的文件在当前工程的 build\publications\publishProject 目录下,截图如下:
在这里插入图片描述

  一般在公司就是将项目发布到私服供其他项目使用.直接操作 publish ,发布到本地使用 publishToMavenLocal 即可.

2.4、发布源代码

  build.gradle 中添加如下配置:

apply plugin :'maven-publish'

//打包源码
task sourceJar(type: Jar) {
    from sourceSets.main.allJava
}

publishing {
    publications {
        publishProject(MavenPublication){
             from components.java
             //调用打包源码发布
             artifact sourceJar {
                classifier "sources"
             }
        }
    }

    repositories {
        maven {
            url = ""
            credentials {
                username 'root'
                password 'admin'
            }
        }
    }
}

  调用 publishToMavenLocal 任务将项目源码发布到本地maven仓库,然后我们就可以去本地仓库中找到发布的源码文件了:
发布的源码文件

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值