使用Gradle構(gòu)建多模塊SpringBoot項目


本項目使用Gradle構(gòu)建SpringBoot項目,將不同的業(yè)務(wù)進(jìn)行不同的模塊劃分(不做微服務(wù)與分布式架構(gòu));

-?編輯器:Intellij IDEA

-?構(gòu)建工具:Gradle4.4

-?SpringBoot版本:2.1.5

項目構(gòu)建

首先創(chuàng)建一個項目,我們使用IDEA構(gòu)建一個Gradle Java項目,作為項目的最外層,只做為整個項目的容器,所以最外層項目只構(gòu)建為普通的Gradle Java項目即可;

填寫GroupId與ArtifactId;

一般正式項目的GroupId為com.*開頭,因為此項目為個人項目,所以使用pers.*開頭,具體規(guī)則大家可以參考命名規(guī)范,ArtifactId為項目名稱;

點擊Next,進(jìn)入Gradle配置頁面;

選擇Use local gradle distribution,配置自己本地的Gradle地址;

點擊Next,Project name自動為ArtifactId,Project location為IDEA默認(rèn)(或你上一次設(shè)置)的WorkSpace,分配WorkSpace;

點擊Finish,完成Gradle Java項目的創(chuàng)建


項目已經(jīng)創(chuàng)建好了,我們開始創(chuàng)建各個模塊,在不同項目中,模塊劃分的方式也會不同,具體的模塊劃分可以按照實際項目的需求進(jìn)行劃分;

在此Demo中,將模塊劃分為:

全局工具模塊:tools-common(項目中所有模塊的全局工具類,基礎(chǔ)模塊依賴此模塊,下面會講到基礎(chǔ)模塊)

視圖模塊:views-demo(項目中的視圖模塊,比如:APP所需接口、管理后臺所需接口,需要進(jìn)行數(shù)據(jù)展示的模塊,都會被此模塊依賴)

業(yè)務(wù)模塊:service-demo1(將項目中不同業(yè)務(wù)進(jìn)行模塊化的區(qū)分,一般在項目中,業(yè)務(wù)模塊是最多的,而且在某個業(yè)務(wù)模塊中需要其他業(yè)務(wù)模塊作為支撐的可以進(jìn)行Gradle依賴,但要避免循環(huán)依賴)

基礎(chǔ)模塊:basic-base(項目中所有業(yè)務(wù)模塊的支撐,此模塊中提供的基礎(chǔ)服務(wù)是所有業(yè)務(wù)模塊中都要用到的,所有業(yè)務(wù)模塊都要依賴此模塊,此模塊依賴全局工具模塊,這樣,所有的模塊都相當(dāng)于間接依賴了全局工具模塊)

1.創(chuàng)建全局工具模塊:

右鍵項目,點擊 New -> Moduel,選擇Spring Initializr,點擊Next

2.配置模塊:

設(shè)置Group,最好與項目的GroupId保持一致;

設(shè)置Artifact,模塊名稱;

設(shè)置Type,我們使用的是Gradle進(jìn)行項目構(gòu)建,所以選擇Gradle Project;

點擊Next

3.配置SpringBoot,也可以不再此處進(jìn)行配置,直接在模塊中的Gradle文件中添加依賴也可以起到同樣的作用,最后在同一說明處會有講解,我們先在此處進(jìn)行配置:

Core:DevTools(項目中一些開發(fā)工具,比如熱部署等)、Lombok(消除冗長的Java代碼,比如get、set、構(gòu)造函數(shù)等,可以直接使用注解);

Web:Web(Spring的一些Web配置);

Template Engines:Thymeleaf(web模板)

Security:Security(安全框架)

SQL:JPA、MySQL(我使用的是MySQL,大家可以根據(jù)實際情況進(jìn)行數(shù)據(jù)庫選擇);

Ops:Actuator(項目監(jiān)控);

點擊Next,會發(fā)現(xiàn)Module name為Artifact,和創(chuàng)建項目時一樣,點擊Finish

注:大家可以根據(jù)自己的項目情況進(jìn)行SpringBoot的配置,配置好之后再窗體中的右邊Selected Dependencies可以查看已選的SpringBoot配置

4.設(shè)置Use local gradle distribution配置Gradle,選擇本地的Gradle地址,點擊OK,完成創(chuàng)建模塊;

5.進(jìn)行Gradle配置,大家可以看到,右邊的的Gradle視圖也多了一個tools-common的模塊,但是有一個問題,他和項目模塊是平級的,在Gradle項目中,根項目應(yīng)該在最外層,其他模塊都應(yīng)包含在根項目中,我們設(shè)置最外層settings.gradle文件,把模塊include到最外層的項目中,然后刷新Gradle


6.所有的模塊進(jìn)行統(tǒng)一步驟的創(chuàng)建

7.進(jìn)行所有模塊的Gradle配置,配置各個模塊之間的依賴,將根Gradle的sourceCompatibility設(shè)置為1.8(我的JDK使用的是1.8),然后刷新Gradle,刪除多余的根(如果出現(xiàn)的話)

8.整理項目中文件

將無用的文件進(jìn)行刪除;

刪除所有模塊中的gradlew文件

刪除所有模塊中的gradlew.bat文件

刪除所有模塊中的gradle文件夾

刪除所有模塊中的.gitignore文件,在項目最外層配置.gitignore文件,做為整個項目的git提交忽略配置

9.配置SpringBoot的application.properties文件:

將所有模塊application.properties進(jìn)行重新命名修改,在多模塊項目中,視圖模塊作為最外層的運行模塊,也就是說views-demo這個模塊最后會被build成jar包(或者war包)運行在服務(wù)器上,作為最外層容器,當(dāng)容器進(jìn)行加載的時候會加載所有的application.properties文件,因為每個模塊都可能會有針對本模塊配置,我們要保證所有的模塊配置都要被SpringBoot加載,了解過SpringBoot的童鞋們都知道,SpringBoot的大部分配置項都可以在application.properties中進(jìn)行直接配置,但是在views-demo加載所有模塊的application.properties文件的時候,由于名稱一致,這時就會出現(xiàn)覆蓋加載的問題,導(dǎo)致一部分的配置無法加載到,這時,就需要我們修改各個模塊的application.properties文件的名稱,保證所有模塊application.properties中的配置項都可以被SpringBoot加載;

這樣確實可以解決覆蓋加載的問題,但是會衍生出一個新的問題,就是SpringBoot默認(rèn)只會去加載名稱為application.properties中的配置項,為了解決這個問題,我們可以使用@Profile注解去配置SpringBoot的加載環(huán)境,在每個模塊中都去做一個配置Bean,然后將所有修改過的資源文件都配置到views-demo中的application.properties文件中,使我們修改過名稱的application.properties文件都被SpringBoot加載;

basic-base模塊

service-demo1模塊

tools-common模塊

views-demo模塊

在views-demo模塊中統(tǒng)一加載修改過的資源文件

10.配置數(shù)據(jù)源:

在所有配置都完成之后,我們似乎可以運行項目了,但是其實還是最后一個地方需要進(jìn)行配置,那就是配置數(shù)據(jù)源,不知道大家是否再記得,我們在配置SpringBoot的時候勾選了SQL塊中的Jpa和MySQL,如果不進(jìn)行數(shù)據(jù)源配置的話運行就會拋出:Cannot determine embedded database driver class for database type NONE異常;

配置數(shù)據(jù)源以及其他基礎(chǔ)配置,配置完成之后我們運行views-demo項目,并進(jìn)行build(打包:jar或war,我只做生成jar文件測試,平時服務(wù)器上也是部署jar文件)測試,如果項目無法build的話,說明程序還是存在問題的;

啟動測試

build測試是否可以生成jar文件,在build的時候可能會出現(xiàn)一個異常,是因為各個模塊中存在與main同級的test的問題,將test刪除即可

刪除各個模塊中的test后進(jìn)行build,build成功后,在views-demo模塊的build->libs中會生成views-demo-0.0.1-SNAPSHOT.jar,我們將jar包直接在liunx環(huán)境下進(jìn)行啟動,看是否可以成功運行;

運行WorkSpace中的views-demo-0.0.1-SNAPSHOT.jar

出現(xiàn)問題以及其他說明

項目結(jié)構(gòu):

basic-base(基礎(chǔ)模塊):所有業(yè)務(wù)模塊都需要用到的業(yè)務(wù)邏輯service;

tools-common(全局工具模塊):所有模塊需要的工具類,說到這,大家可能會有一個疑問,在上面的截圖中,大家會發(fā)現(xiàn)在每個模塊的入口處有一個包,包結(jié)構(gòu)為:

pers.fly.common

- - - - - - - -|config

- - - - - - - -|tools

在項目的結(jié)構(gòu)中已經(jīng)存在了一個common的工具模塊,為什么每個包下還會存在tools這種工具包。又一次,我的一個朋友曾經(jīng)和我說,在項目中你會發(fā)現(xiàn)有的工具類只有本項目才會用到,那為什么不在每個模塊中建立一個只放置本模塊的工具類的包呢,然后把所有模塊都會用到的工具類放到全局公共區(qū)域;這樣的規(guī)劃的話顯然是更合理的;

service-demo1(業(yè)務(wù)模塊):此項目只為演示使用Gradle構(gòu)建SpringBoot多模塊項目,在實際項目開發(fā)中,會存在多個業(yè)務(wù)模塊,所有業(yè)務(wù)模塊都已service-開頭,所以此項目中只有一個業(yè)務(wù)模塊,并且以demo1命名,在實際項目中最好不要出現(xiàn)數(shù)字,相關(guān)規(guī)則大家查看Java的命名規(guī)范,結(jié)合實際情況;

views-demo(視圖模塊):存放對外提供的接口,Controller接口的放置位置,針對具體的業(yè)務(wù)場景或者不同的終端;比如,這個視圖模塊只放置**的業(yè)務(wù)模塊的接口,或者只放置對APP端提供的接口,或者只放置對PC端提供的接口,或者只放置對微信端的接口等等;在實際項目中,視圖層模塊也可能存在多個;

@Profile的使用:

學(xué)習(xí)過SpringBoot的童鞋肯定知道@Profile,在這我要說明一點,我在學(xué)習(xí)SpringBoot中的時候,網(wǎng)上的一些資料和書本中都有講解過@Profile的作用,大部分的資料和書籍說@Profile是為了方便區(qū)分項目環(huán)境而進(jìn)行的配置,在實際項目中,項目環(huán)境會分為開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境(標(biāo)準(zhǔn)的項目環(huán)境應(yīng)該還會存在預(yù)發(fā)布環(huán)境),在這些環(huán)境中某些配置是不一樣的,比如數(shù)據(jù)庫的鏈接地址,連接池的配置或者等等其他的一些配置,然后使用@Profile是為了區(qū)分這些環(huán)境去配置一些不同的application.properties資源文件配置;我個人認(rèn)為@Profile既然可以去做到將不同的環(huán)境區(qū)分,并且可以指定某個或同時指定多個環(huán)境的配置,那為什么只能作為項目環(huán)境的區(qū)分,如果要區(qū)分項目環(huán)境的話,有很多方法,比如在使用Git作為版本管理的時候,我們可以使用分支來作為區(qū)分,而且SpringBoot的配置文件的加載順序是從與項目平級的配置文件開始加載,然后在加載項目中的配置文件,在加載模塊中的配置文件,它的優(yōu)先級是從外到內(nèi)的(配置文件中,如果存在Java類配置的話Java類的優(yōu)先級是高于application.properties的優(yōu)先級的),在上不同的環(huán)境時我們可以在服務(wù)器上和jar包放置不同環(huán)境的application.properties文件也可以做到項目環(huán)境的區(qū)分;我還查閱了官方文檔,官方文檔是這樣描述的:

大概意思就是可以使用命名約定(application-{**}.properties)去加載、定義應(yīng)用程序,官方文檔確實也使用了development、production去做一些例子,但個人認(rèn)為@Profile不應(yīng)該僅僅只是為了區(qū)分項目環(huán)境,最重要的是它可以靈活的去定義一些配置;

配置完數(shù)據(jù)源之后還是會拋出Cannot determine embedded database driver class for database type NONE異常問題:

在使用Gradle構(gòu)建SpringBoot項目的時候,出現(xiàn)過這樣的問題,在加載多個模塊的時候,明明配置了好了數(shù)據(jù)源也指定了數(shù)據(jù)庫的類型,但還是會拋出,并且在Run/Debug Configurations中確實是以Application方式啟動并且也指定了Working directory的項目地址,但是還是不行,后來發(fā)現(xiàn)將.idea刪除,重新使項目配置加載,然后這個問題就解決了,具體為什么我也不是特別明白,可能是idea的緩存?或者是Mac下idea的不兼容?我用的是Mac,不知道Windows下有沒有同樣的問題;

關(guān)于build失敗的問題:

在進(jìn)行build的時候會出現(xiàn)一個異常,在上面的截圖中build測試的時候也說了這個問題,拋出的異常信息顯示是關(guān)于測試文件的加載問題,具體為什么會出現(xiàn)這樣的問題,詳細(xì)原因目前為止還沒有找到,當(dāng)前的解決方法就是刪除test模塊,刪除之后確實可以進(jìn)行build,但是終歸不是長久之計,一個完整的項目怎么能沒有測試呢,這個問題接下來還是要處理一下;

說明:以上均為個人見解,如果有不對的地方或者各位童鞋有不同的見解以及意見,歡迎留言指正~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容