开头说两句
Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: java 技术大本营
原创不易,转载请注明出处
#项目背景
读过小刀以前文章的小伙伴应该还记得,小刀和大家分享过,如何用 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 版本,依赖等等,这里小刀填一个最小化的版本:
然后选生成工程,打开后,可得到一个开箱即用的工程
但是这个工程是单模块的,我们要把他改造成多模块的
改造成多模块项目
改造并不麻烦, 像以前在 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 这个文件夹中.现在的项目结构如下图所示:
配置全局配置项
以前在用 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. 具体怎么选择,可根据公司业务来选择.
注意依赖和配置的位置
- 虽说现在这样项目已经可以跑起来了,但实际上,还是有不少坑,如主 build.gradle 里面不要引依赖,但是可以写版本号.
- 只能在 admin,service 的 build.gradle 里面写 springboot 的插件
- 配置文件,只能放在 admin 和 service 的 resources 目录下
- 类如 mybatis 的连接, redis 的连接配置, apollo,mq 等配置,都只能放在 admin/service 的相关位置
最后说两句
做到上面这些, 一个简单的 gradle 多模块化项目就搭建完成, 如果需要研究下复杂的怎么配置,可以参考 spring 源码中的 build.gradle 的写法:
https://github.com/weixiaodexiaoxiaodao/spring-framework/blob/master/build.gradle
大家在配置过程中有什么问题欢迎随时给小刀留言或加小刀微信一起讨论:best396975802
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于