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仓库,然后我们就可以去本地仓库中找到发布的源码文件了: