Idea+Gradle搭建SpringBoot多模塊項(xiàng)目

1.創(chuàng)建項(xiàng)目

1.1 創(chuàng)建一個(gè)Gradle項(xiàng)目

image.png

1.2 設(shè)置GroupId晚胡、ArtifactId、Version

image.png

1.3 Gradle配置,可以使用默認(rèn)统刮。如果本地沒有安裝gradle環(huán)境故源,idea會(huì)自動(dòng)下載并安裝污抬。

image.png

1.4 設(shè)置項(xiàng)目目錄

image.png

點(diǎn)擊完成,進(jìn)行項(xiàng)目的創(chuàng)建心软。項(xiàng)目創(chuàng)建完成后壕吹,如下圖:


image.png

這里可以先刪除掉src目錄著蛙,因?yàn)槲覀兪嵌嗄K項(xiàng)目,所以不需要使用主項(xiàng)目下的src耳贬。

1.5 創(chuàng)建子Module

主項(xiàng)目包括以下Module:view踏堡、service、data咒劲、common

  • view:是MVC的視圖層顷蟆,用來接收用戶請(qǐng)求,并響應(yīng)腐魂。
  • service:用于處理業(yè)務(wù)邏輯帐偎。
  • data:用來直接操作數(shù)據(jù)庫。
  • common:公共庫蛔屹。
    四者的依賴關(guān)系如下:


    image.png

    view依賴service削樊,service依賴data,而view兔毒、service漫贞、data三者公共依賴common。
    子Module的創(chuàng)建可依賴于Spring Initializr育叁。

1.5.1 創(chuàng)建ViewModule

image.png

創(chuàng)建的是一個(gè)Spring Initializr項(xiàng)目


image.png

設(shè)置Module參數(shù)迅脐,記得Type一定要選Gradle Project,因?yàn)槲覀兪褂肎radle來構(gòu)建子模塊豪嗽。


image.png

選擇依賴谴蔑,這里選擇最基本的配置。
image.png

設(shè)置Module名稱龟梦,點(diǎn)擊finish完成Module的創(chuàng)建隐锭。
image.png

finish后會(huì)彈框顯示Gradle配置,點(diǎn)擊OK变秦。


image.png

刪除每個(gè)Module下的.gradle目錄成榜、gradle目錄、.gitignore文件蹦玫、gradlew赎婚、gradlew.bat、settings.gradle樱溉。只要主項(xiàng)目下有這些文件就可以了挣输。并且刪除demo-common、demo-data福贞、demo-service模塊下的Application類撩嚼,由于demo-view為啟動(dòng)Module,只需要demo-view下有啟動(dòng)類就可以了。
image.png

最終項(xiàng)目的結(jié)構(gòu)為
image.png

1.5.2 創(chuàng)建其他Module和上面方式一樣完丽,只需要修改對(duì)應(yīng)的AtifactId和ModuleName恋技。創(chuàng)建好的項(xiàng)目結(jié)構(gòu)如下:

image.png

2.模塊依賴

我們之前說過,View依賴Service逻族,Service依賴Data蜻底,View、Service聘鳞、Data共同依賴Common薄辅。所以我們需要修改各Module的build.gradle文件。
修改項(xiàng)目目錄下的settings.gradle為

rootProject.name = 'SpringDemo'
include 'demo-common'
include 'demo-data'
include 'demo-service'
include 'demo-view'
  • rootProject.name 指定項(xiàng)目名稱
  • include 指定依賴的子Module名稱

2.1 demo-common的build.gradle文件配置如下:

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
    id 'idea'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2.2 demo-data的build.gradle文件配置如下:

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
    id 'idea'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compile project(':demo-common')
}

demo-data的build.gradle文件中抠璃,在dependencies下使用compile依賴了demo-common站楚。

2.3 demo-service的build.gradle文件配置如下:

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
    id 'idea'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compile project(':demo-data')
}

demo-service的build.gradle文件中,在dependencies下使用compile依賴了demo-data搏嗡。由于使用compile的方式依賴窿春,所以demo-service也間接的依賴了demo-common。

2.4 demo-view的build.gradle文件配置如下:

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
    id 'idea'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compile project(':demo-service')
}

同理彻况,demo-view依賴了demo-service谁尸,并間接依賴了demo-data和demo-common,大家有興趣可以了解一下Gradle的依賴配置纽甘,implementation、api抽碌、compile悍赢、provider等等幾種依賴方式的區(qū)別。

2.5 主項(xiàng)目的build.gradle文件配置如下:

buildscript {
    allprojects {
        gradle.projectsEvaluated {
            allprojects {
                jar { enabled = true }
            }
        }
    }
}
plugins {
    id 'java'
    id 'idea'
}

group 'com.test'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

由于各模塊直接的依賴是已jar的方式货徙,所以在allprojects下加入 jar { enabled = true }配置左权,也可以在各模塊的build.gradle文件下加入 jar { enabled = true }。

2.6 修改application.properties

由于每個(gè)Moudle下都會(huì)有application.properties文件痴颊,編譯打包的時(shí)候會(huì)合并各個(gè)Module下的application.properties赏迟,所以我們需要修改Module下的application.properties文件的名稱。修改如下


image.png
  • demo-data下的application.properties文件重命名為application-common.properties
  • demo-common下的application.properties文件重命名為application-common.properties
  • demo-service下的application.properties文件重命名為application-service.properties
  • 在demo-view下增加application-view.properties文件蠢棱,但是不能刪除默認(rèn)的application.properties文件锌杀。因?yàn)閐emo-view作為SpringBoot的啟動(dòng)Module。
    修改demo-view下的application.properties文件泻仙,引入各個(gè)Module下的properties文件
#導(dǎo)入application.properties
spring.profiles.active=\
  common,\
  data,\
  service,\
  view

3.項(xiàng)目配置

3.1 數(shù)據(jù)配置

本Demo中使用JPA做演示糕再,其他orm配置大家可以自己查找資料

3.1.1 數(shù)據(jù)庫連接配置

在demo-data Moudle的application-data.properties文件下加入以下配置,這里也是最基本的配置玉转,大家可以根據(jù)項(xiàng)目實(shí)際需求去修改數(shù)據(jù)庫配置突想。

#JPA配置
spring.datasource.url=jdbc:mysql://localhost:3306/demo-spring?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
spring.jpa.database=MYSQL
spring.jpa.show-sql=true
spring.jpa.open-in-view=false
spring.jpa.generate-ddl=true  
#spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy

3.1.2 創(chuàng)建實(shí)體類

在demo-data Module中創(chuàng)建entity包,創(chuàng)建一個(gè)User類。


image.png

3.1.3 創(chuàng)建Repository

在demo-data Module中創(chuàng)建repository包猾担,創(chuàng)建一個(gè)UserRepository接口繼承CrudRepository接口袭灯,并創(chuàng)建一個(gè)查詢。通過username查找User绑嘹。


image.png

3.2 Service創(chuàng)建

3.2.1 創(chuàng)建UserService接口稽荧,并創(chuàng)建相關(guān)方法。

image.png

3.2.2 創(chuàng)建UserServiceImpl類圾叼,實(shí)現(xiàn)UserService接口蛤克,加入@Service注解,并注入U(xiǎn)serRepository夷蚊。實(shí)現(xiàn)相關(guān)業(yè)務(wù)邏輯方法构挤。

image.png

3.3 Controller創(chuàng)建

創(chuàng)建UserApi類,添加RestController注解惕鼓,并且注入U(xiǎn)serService筋现。添加RESTful風(fēng)格的api。


image.png

現(xiàn)在就可以跑起來了箱歧。直接執(zhí)行DemoViewApplication中的Main方法矾飞。


image.png

現(xiàn)在測(cè)試接口
image.png

image.png

執(zhí)行成功。并且數(shù)據(jù)也成功保存到數(shù)據(jù)庫⊙叫希現(xiàn)在這個(gè)簡(jiǎn)單的SpringBoot多模塊項(xiàng)目就已經(jīng)搭建好了洒沦。
現(xiàn)在就可以通過Gradle打包成jar包來執(zhí)行〖厶剩可以使用idea右側(cè)工具欄的gradle工具申眼,或者在控制臺(tái)中使用Gradlew命令來執(zhí)行打包。需要注意的是由于demo-view模塊是啟動(dòng)模塊蝉衣,所以需要執(zhí)行demo-view模塊下的build和bootJar任務(wù)來打啟動(dòng)jar括尸。

  • 命令方式


    image.png
  • 工具方式(需要執(zhí)行demo-view模塊下的任務(wù))


    image.png

項(xiàng)目中g(shù)radle的配置比較簡(jiǎn)單,大家可以根據(jù)實(shí)際需求進(jìn)行優(yōu)化Gradle的配置病毡。gradle的打可執(zhí)行jar需要注意各模塊間的依賴濒翻,啟動(dòng)模塊以jar包的方式依賴其他模塊。并且啟動(dòng)jar需要在demo-view模塊中打包啦膜,也就是需要在啟動(dòng)模塊有送,又入口main方法的模塊進(jìn)行打包。

項(xiàng)目github地址: https://github.com/BlueSkyYk/Demo-SpringMultipleModules

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末功戚,一起剝皮案震驚了整個(gè)濱河市娶眷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸臀,老刑警劉巖届宠,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烁落,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡豌注,警方通過查閱死者的電腦和手機(jī)伤塌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轧铁,“玉大人每聪,你說我怎么就攤上這事〕莘纾” “怎么了药薯?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)救斑。 經(jīng)常有香客問我童本,道長(zhǎng),這世上最難降的妖魔是什么脸候? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任穷娱,我火速辦了婚禮,結(jié)果婚禮上运沦,老公的妹妹穿的比我還像新娘泵额。我一直安慰自己,他們只是感情好携添,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布嫁盲。 她就那樣靜靜地躺著,像睡著了一般烈掠。 火紅的嫁衣襯著肌膚如雪亡资。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天向叉,我揣著相機(jī)與錄音,去河邊找鬼嗦董。 笑死母谎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的京革。 我是一名探鬼主播奇唤,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼匹摇!你這毒婦竟也來了咬扇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤廊勃,失蹤者是張志新(化名)和其女友劉穎懈贺,沒想到半個(gè)月后经窖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梭灿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年画侣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堡妒。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡配乱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皮迟,到底是詐尸還是另有隱情搬泥,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布伏尼,位于F島的核電站忿檩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烦粒。R本人自食惡果不足惜休溶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扰她。 院中可真熱鬧兽掰,春花似錦、人聲如沸徒役。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忧勿。三九已至杉女,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸳吸,已是汗流浹背熏挎。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晌砾,地道東北人坎拐。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像养匈,于是被迫代替她去往敵國和親哼勇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容