架构设计-从零开始搭建gradle多模块项目

Updated on with 921 views

开头说两句

小小刀博客: https://www.lixiang.red
小小刀公众号: 程序员心情站
image.png

原创不易,转载请注明出处

#项目背景
读过小刀以前文章的小伙伴应该还记得,小刀和大家分享过,如何用thymeleaf生成mybatis的模板:
https://www.lixiang.red/articles/2019/07/23/1563857782748.html
也和大家分享过,如何去设计小刀目前负责的商品模块:
https://www.lixiang.red/articles/2019/07/25/1564025186602.html
现在工具类有了,设计也有了,下面就要开始搭建项目了,今天小刀就和大家分享一下如何用gradle创建一个多模块的应用

技术选型

spring-boot: java做web开发,这个差不多是基础了
mybatis: 做javaweb开发,连数据库大都是用的这个
redis: 做javaweb开发,缓存大都是用的这个
用的都是常用的东西,没什么新特色,大家对技术选型这块,可以不考虑这么多,随大流就行了,想高级一点,就深入把每一部分的原理弄清楚.

gradle 简介

为什么选gradle没有用maven呢 ,gradle做为新一代的构建工具,说实话,构建速度,我还真没对比过,但就方便省事而言,gradle还是挺省事的,写的代码变少了,也清晰了不少,而且迭代升级超快,去年第一次接触gradle的时候还是4.x的版本,现在都5.x了

gradle 配置多模块项目

想要学习gradle多模块最好的方式,就是看看spring源码, spring 源码就是用的gradle进行构建,小刀fork了官网的spring项目,并且新加子一个中文注释的分支
https://github.com/weixiaodexiaoxiaodao/spring-framework 分支是:5_1_x_study
所以需要复杂构建的小伙伴可以看看spring中是怎么写的,但是现在简单的构建 可以直按小刀下面的写法, 我们一起来创建一个基本的项目,以后的项目都上课就那样以这个为蓝本进行构建

生成初始项目

初始项目的生成,我们还是选用spring官方的生成方式:
https://start.spring.io/
在这个页面,我们可以选择一些通用的配置, 如, maven , gradle ,jdk版本,依赖等等,这里小刀填一个最小化的版本:
image.png
image.png
然后选生成工程,打开后,可得到一个开箱即用的工程
image.png
但是这个工程是单模块的,我们要把他改造成多模块的

改造成多模块项目

改造并不麻烦, 像以前在maven工程中, 需要在主pom里面声明Module一样, gradle需要在settings.gradle里面添加名处模块的名称:

rootProject.name = 'market'
include 'market-admin'
include 'market-client'
include 'market-service'
include 'market-common'
include 'market-business'
include 'market-business-impl'

然后在对应着新建文件夹,然后把我们初始化生成项目中的文件,复制到market-admin 这个文件夹中.现在的项目结构如下图所示:
image.png

配置全局配置项

以前在用maven时, 我们需要一个额外的setting.xml来配置maven使用的镜像之类的,在gradle中,就不需要额外的文件了,只需要在build.gradle里面配置即可.所以现在我们在主build.gradle中进行配置整个项目的maven仓库的地址

配置maven仓库的地址

allprojects {
	repositories {
		maven { url getMavenPublicUrl()
			credentials {
				username 'xxxx'
				password 'xxxx'
			}
		}
		maven { url getMavenSnapshotUrl()
			credentials {
				username 'xxxx'
				password 'xxxx'
			}
		}

	}
}

def getMavenPublicUrl(){
	def  url = "http://xxxxx.xxxxx:port/repository/maven-public/";
	if(project.hasProperty('BUILD_TYPE')){
		if(BUILD_TYPE == "test"){
			println "现在是测试环境"
			url = "http://xxxxx.xxxxx:8081/repository/maven-public/"
		}
	}
	return url
}

def getMavenSnapshotUrl(){
	def  url = "http://xxxxx.xxxxxxx:port/repository/maven-snapshots/";
	if(project.hasProperty('BUILD_TYPE')){
		if(BUILD_TYPE == "test"){
			println "现在是测试环境"
			url = "http://xxxxxx:8081/repository/maven-snapshots/"
		}
	}
	return url
}

这里面我们可以通过脚本来判断当前执行构建的是什么环境,不同的环境有不同的maven地址, 启动构建时需要传参:

gradle bootjar -PBUILD_TYPE=test --refresh-dependencies -info -b ${app_name}/build.gradle

配置gradle插件的地址

在settings里面顶头开始写,小刀这里是用的阿里云公开的gradle插件地址,如果是用自己nexus服务的话,需要先在nexus上新建一个代理repo,然后代理gradle 插件地址, settings.build中再对应的地址改为nexus中新建的repo的地址

pluginManagement {
	repositories {
		maven { url "https://maven.aliyun.com/repository/gradle-plugin"
		}
	}
}

模块及功能划分

如上面目录结构图所示,一般来说,这几层都是避不可免的,对外提供web访问的admin模块,打包出去的client模块, 对外提供dubbo接口的service模块,供admin,service调用的business接口模块,business的实现逻辑的business-impl模块,自己项目定制化的工具类,通用的配置等等.

这里一直有个小纠结,就是现在很多项目其实写了接口,也只是一个实现类,并没有说很多实现类怎么样, business和business-impl 实际上是一对一的关系,这里面会有不少小伙伴选择新建项目时,去除掉 business和 bubsiness-impl , 用一层manager来顶替接口和实现类,admin调用manager , manager调用dao. 具体怎么选择,可根据公司业务来选择.

注意依赖和配置的位置

  1. 虽说现在这样项目已经可以跑起来了,但实际上,还是有不少坑,如主build.gradle里面不要引依赖,但是可以写版本号.
  2. 只能在admin,service的build.gradle里面写springboot的插件
  3. 配置文件,只能放在admin和service的resources目录下
  4. 类如mybatis的连接, redis的连接配置, apollo,mq 等配置,都只能放在admin/service的相关位置

最后说两句

做到上面这些, 一个简单的gradle多模块化项目就搭建完成, 如果需要研究下复杂的怎么配置,可以参考spring 源码中的build.gradle的写法:
https://github.com/weixiaodexiaoxiaodao/spring-framework/blob/master/build.gradle
大家在配置过程中有什么问题欢迎随时给小刀留言或加小刀微信一起讨论:best396975802


标题:架构设计-从零开始搭建gradle多模块项目
作者:xiaodaojava
地址:https://www.lixiang.red/articles/2019/07/27/1564197569630.html

Responses