使用Gradle构建多模块SpringBoot项目

使用Gradle构建多模块SpringBoot项目

本项目使用Gradle构建SpringBoot项目,将不一样的业务进行不一样的模块划分(不作微服务与分布式架构); 
- 编辑器:Intellij IDEA 
- 构建工具:Gradle3.5 
- SpringBoot版本:1.5.8 
- 版本管理:GitHub 
- 我的GitHub地址:https://github.com/fanlongfei0212 
- 项目Clone地址:https://github.com/fanlongfei0212/demo.gitgit


项目构建
  • 首先建立一个项目,咱们使用IDEA构建一个Gradle Java项目,做为项目的最外层,只作为整个项目的容器,因此最外层项目只构建为普通的Gradle Java项目便可; 
    这里写图片描述github

  • 填写GroupId与ArtifactId; 
    通常正式项目的GroupId为com.*开头,由于此项目为我的项目,因此使用pers.*开头,具体规则你们能够参考命名规范,ArtifactId为项目名称;
     
    这里写图片描述spring

  • 点击Next,进入Gradle配置页面; 
    选择Use local gradle distribution,配置本身本地的Gradle地址; 
    点击Next,Project name自动为ArtifactId,Project location为IDEA默认(或你上一次设置)的WorkSpace,分配WorkSpace; 
    点击Finish,完成Gradle Java项目的建立
     
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述数据库

  • 项目已经建立好了,咱们开始建立各个模块,在不一样项目中,模块划分的方式也会不一样,具体的模块划分能够按照实际项目的需求进行划分; 
    在此Demo中,将模块划分为: 
    全局工具模块:tools-common(项目中全部模块的全局工具类,基础模块依赖此模块,下面会讲到基础模块) 
    视图模块:views-demo(项目中的视图模块,好比:APP所需接口、管理后台所需接口,须要进行数据展现的模块,都会被此模块依赖) 
    业务模块:service-demo1(将项目中不一样业务进行模块化的区分,通常在项目中,业务模块是最多的,并且在某个业务模块中须要其余业务模块做为支撑的能够进行Gradle依赖,但要避免循环依赖) 
    基础模块:basic-base(项目中全部业务模块的支撑,此模块中提供的基础服务是全部业务模块中都要用到的,全部业务模块都要依赖此模块,此模块依赖全局工具模块,这样,全部的模块都至关于间接依赖了全局工具模块)
    缓存

  • 1.建立全局工具模块: 
    右键项目,点击 New -> Moduel,选择Spring Initializr,点击Next
     
    这里写图片描述
    这里写图片描述springboot

  • 2.配置模块: 
    设置Group,最好与项目的GroupId保持一致; 
    设置Artifact,模块名称; 
    设置Type,咱们使用的是Gradle进行项目构建,因此选择Gradle Project; 
    点击Next
     
    这里写图片描述服务器

  • 3.配置SpringBoot,也能够再也不此处进行配置,直接在模块中的Gradle文件中添加依赖也能够起到一样的做用,最后在同一说明处会有讲解,咱们先在此处进行配置: 
    Core:DevTools(项目中一些开发工具,好比热部署等)、Lombok(消除冗长的Java代码,好比get、set、构造函数等,能够直接使用注解); 
    Web:Web(Spring的一些Web配置); 
    SQL:JPA、MySQL(我使用的是MySQL,你们能够根据实际状况进行数据库选择); 
    Ops:Actuator(项目监控); 
    点击Next,会发现Module name为Artifact,和建立项目时同样,点击Finish
    微信

  • 注:你们能够根据本身的项目状况进行SpringBoot的配置,配置好以后再窗体中的右边Selected Dependencies能够查看已选的SpringBoot配置 
    这里写图片描述
    这里写图片描述markdown

  • 4.设置Use local gradle distribution配置Gradle,选择本地的Gradle地址,点击OK,完成建立模块; 
    这里写图片描述
    这里写图片描述架构

  • 5.进行Gradle配置,你们能够看到,右边的的Gradle视图也多了一个tools-common的模块,可是有一个问题,他和项目模块是平级的,在Gradle项目中,根项目应该在最外层,其余模块都应包含在根项目中,咱们设置最外层settings.gradle文件,把模块include到最外层的项目中,而后刷新Gradle 
    这里写图片描述
    你们会发现有的时候可能会出现两个根,其实只有一个,在Mac下初步断定是IDEA的兼容或显示问题,你们删除最下面的那个就能够了(选中第二个根,点击Gradle视图上的‘-’便可),正常删除的时候Gradle会出现删除提示,可是删除错误显示的时候你会发现,没有提示,这是正常的,由于具备真实存在的根 
    这里写图片描述
    这里写图片描述

  • 6.全部的模块进行统一步骤的建立 
    这里写图片描述

  • 7.进行全部模块的Gradle配置,配置各个模块之间的依赖,将根Gradle的sourceCompatibility设置为1.8(个人JDK使用的是1.8),而后刷新Gradle,删除多余的根(若是出现的话) 
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

  • 8.整理项目中文件 
    将无用的文件进行删除; 
    删除全部模块中的gradlew文件 
    删除全部模块中的gradlew.bat文件 
    删除全部模块中的gradle文件夹 
    删除全部模块中的.gitignore文件,在项目最外层配置.gitignore文件,作为整个项目的git提交忽略配置
     
    这里写图片描述
    这里写图片描述

  • 9.配置SpringBoot的application.properties文件: 
    将全部模块application.properties进行从新命名修改,在多模块项目中,视图模块做为最外层的运行模块,也就是说views-demo这个模块最后会被build成jar包(或者war包)运行在服务器上,做为最外层容器,当容器进行加载的时候会加载全部的application.properties文件,由于每一个模块均可能会有针对本模块配置,咱们要保证全部的模块配置都要被SpringBoot加载,了解过SpringBoot的童鞋们都知道,SpringBoot的大部分配置项均可以在application.properties中进行直接配置,可是在views-demo加载全部模块的application.properties文件的时候,因为名称一致,这时就会出现覆盖加载的问题,致使一部分的配置没法加载到,这时,就须要咱们修改各个模块的application.properties文件的名称,保证全部模块application.properties中的配置项均可以被SpringBoot加载; 
    这样确实能够解决覆盖加载的问题,可是会衍生出一个新的问题,就是SpringBoot默认只会去加载名称为application.properties中的配置项,为了解决这个问题,咱们可使用@Profile注解去配置SpringBoot的加载环境,在每一个模块中都去作一个配置Bean,而后将全部修改过的资源文件都配置到views-demo中的application.properties文件中,使咱们修改过名称的application.properties文件都被SpringBoot加载;
     
    basic-base模块 
    这里写图片描述
    这里写图片描述
    service-demo1模块 
    这里写图片描述
    这里写图片描述
    tools-common模块 
    这里写图片描述
    这里写图片描述
    views-demo模块 
    这里写图片描述
    这里写图片描述
    在views-demo模块中统一加载修改过的资源文件 
    这里写图片描述
    这里写图片描述

  • 10.配置数据源: 
    在全部配置都完成以后,咱们彷佛能够运行项目了,可是其实仍是最后一个地方须要进行配置,那就是配置数据源,不知道你们是否再记得,咱们在配置SpringBoot的时候勾选了SQL块中的Jpa和MySQL,若是不进行数据源配置的话运行就会抛出:Cannot determine embedded database driver class for database type NONE异常;
     
    这里写图片描述
    配置数据源以及其余基础配置,配置完成以后咱们运行views-demo项目,并进行build(打包:jar或war,我只作生成jar文件测试,平时服务器上也是部署jar文件)测试,若是项目没法build的话,说明程序仍是存在问题的; 
    这里写图片描述
    启动测试 
    这里写图片描述
    这里写图片描述
    这里写图片描述
    build测试是否能够生成jar文件,在build的时候可能会出现一个异常,是由于各个模块中存在与main同级的test的问题,将test删除便可 
    这里写图片描述
    这里写图片描述
    删除各个模块中的test后进行build,build成功后,在views-demo模块的build->libs中会生成views-demo-0.0.1-SNAPSHOT.jar,咱们将jar包直接在liunx环境下进行启动,看是否能够成功运行; 
    这里写图片描述
    这里写图片描述
    运行WorkSpace中的views-demo-0.0.1-SNAPSHOT.jar 
    这里写图片描述
    这里写图片描述
    这里写图片描述

出现问题以及其余说明

项目结构: 
basic-base(基础模块):全部业务模块都须要用到的业务逻辑service; 
tools-common(全局工具模块):全部模块须要的工具类,说到这,你们可能会有一个疑问,在上面的截图中,你们会发如今每一个模块的入口处有一个包,包结构为: 
pers.fly.common 
- - - - - - - -|config 
- - - - - - - -|tools 
在项目的结构中已经存在了一个common的工具模块,为何每一个包下还会存在tools这种工具包。又一次,个人一个朋友曾经和我说,在项目中你会发现有的工具类只有本项目才会用到,那为何不在每一个模块中创建一个只放置本模块的工具类的包呢,而后把全部模块都会用到的工具类放到全局公共区域;这样的规划的话显然是更合理的; 
service-demo1(业务模块):此项目只为演示使用Gradle构建SpringBoot多模块项目,在实际项目开发中,会存在多个业务模块,全部业务模块都已service-开头,因此此项目中只有一个业务模块,而且以demo1命名,在实际项目中最好不要出现数字,相关规则你们查看Java的命名规范,结合实际状况; 
views-demo(视图模块):存放对外提供的接口,Controller接口的放置位置,针对具体的业务场景或者不一样的终端;好比,这个视图模块只放置**的业务模块的接口,或者只放置对APP端提供的接口,或者只放置对PC端提供的接口,或者只放置对微信端的接口等等;在实际项目中,视图层模块也可能存在多个;

@Profile的使用: 
学习过SpringBoot的童鞋确定知道@Profile,在这我要说明一点,我在学习SpringBoot中的时候,网上的一些资料和书本中都有讲解过@Profile的做用,大部分的资料和书籍说@Profile是为了方便区分项目环境而进行的配置,在实际项目中,项目环境会分为开发环境、测试环境、生产环境(标准的项目环境应该还会存在预发布环境),在这些环境中某些配置是不同的,好比数据库的连接地址,链接池的配置或者等等其余的一些配置,而后使用@Profile是为了区分这些环境去配置一些不一样的application.properties资源文件配置;我我的认为@Profile既然能够去作到将不一样的环境区分,而且能够指定某个或同时指定多个环境的配置,那为何只能做为项目环境的区分,若是要区分项目环境的话,有不少方法,好比在使用Git做为版本管理的时候,咱们可使用分支来做为区分,并且SpringBoot的配置文件的加载顺序是从与项目平级的配置文件开始加载,而后在加载项目中的配置文件,在加载模块中的配置文件,它的优先级是从外到内的(配置文件中,若是存在Java类配置的话Java类的优先级是高于application.properties的优先级的),在上不一样的环境时咱们能够在服务器上和jar包放置不一样环境的application.properties文件也能够作到项目环境的区分;我还查阅了官方文档,官方文档是这样描述的: 
这里写图片描述
大概意思就是可使用命名约定(application-{**}.properties)去加载、定义应用程序,官方文档确实也使用了development、production去作一些例子,但我的认为@Profile不该该仅仅只是为了区分项目环境,最重要的是它能够灵活的去定义一些配置;

配置完数据源以后仍是会抛出Cannot determine embedded database driver class for database type NONE异常问题: 
在使用Gradle构建SpringBoot项目的时候,出现过这样的问题,在加载多个模块的时候,明明配置了好了数据源也指定了数据库的类型,但仍是会抛出,而且在Run/Debug Configurations中确实是以Application方式启动而且也指定了Working directory的项目地址,可是仍是不行,后来发现将.idea删除,从新使项目配置加载,而后这个问题就解决了,具体为何我也不是特别明白,多是idea的缓存?或者是Mac下idea的不兼容?我用的是Mac,不知道Windows下有没有一样的问题;

关于build失败的问题: 
在进行build的时候会出现一个异常,在上面的截图中build测试的时候也说了这个问题,抛出的异常信息显示是关于测试文件的加载问题,具体为何会出现这样的问题,详细缘由目前为止尚未找到,当前的解决方法就是删除test模块,删除以后确实能够进行build,可是终归不是长久之计,一个完整的项目怎么能没有测试呢,这个问题接下来仍是要处理一下;

说明:以上均为我的看法,若是有不对的地方或者各位童鞋有不一样的看法以及意见,欢迎留言指正~~

相关文章
相关标签/搜索