技术选型
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里面添加名处模块的名称:
代码语言:javascript复制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仓库的地址
代码语言:javascript复制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地址, 启动构建时需要传参:
代码语言:javascript复制gradle bootjar -PBUILD_TYPE=test --refresh-dependencies -info -b ${app_name}/build.gradle
配置gradle插件的地址
在settings里面顶头开始写,小刀这里是用的阿里云公开的gradle插件地址,如果是用自己nexus服务的话,需要先在nexus上新建一个代理repo,然后代理gradle 插件地址, settings.build中再对应的地址改为nexus中新建的repo的地址
代码语言:javascript复制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的相关位置