本項目使用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,可是終歸不是長久之計,一個完整的項目怎麼能沒有測試呢,這個問題接下來仍是要處理一下;說明:以上均爲我的看法,若是有不對的地方或者各位童鞋有不一樣的看法以及意見,歡迎留言指正~~