Idea+Gradle搭建SpringBoot多模块项目

1.创建项目

1.1 创建一个Gradle项目

image.png

1.2 设置GroupId、ArtifactId、Version

image.png

1.3 Gradle配置,可以使用默认。如果本地没有安装gradle环境,idea会自动下载并安装。

image.png

1.4 设置项目目录

image.png

点击完成,进行项目的创建。项目创建完成后,如下图:


image.png

这里可以先删除掉src目录,因为我们是多模块项目,所以不需要使用主项目下的src。

1.5 创建子Module

主项目包括以下Module:view、service、data、common

  • view:是MVC的视图层,用来接收用户请求,并响应。
  • service:用于处理业务逻辑。
  • data:用来直接操作数据库。
  • common:公共库。
    四者的依赖关系如下:


    image.png

    view依赖service,service依赖data,而view、service、data三者公共依赖common。
    子Module的创建可依赖于Spring Initializr。

1.5.1 创建ViewModule

image.png

创建的是一个Spring Initializr项目


image.png

设置Module参数,记得Type一定要选Gradle Project,因为我们使用Gradle来构建子模块。


image.png

选择依赖,这里选择最基本的配置。
image.png

设置Module名称,点击finish完成Module的创建。
image.png

finish后会弹框显示Gradle配置,点击OK。


image.png

删除每个Module下的.gradle目录、gradle目录、.gitignore文件、gradlew、gradlew.bat、settings.gradle。只要主项目下有这些文件就可以了。并且删除demo-common、demo-data、demo-service模块下的Application类,由于demo-view为启动Module,只需要demo-view下有启动类就可以了。
image.png

最终项目的结构为
image.png

1.5.2 创建其他Module和上面方式一样,只需要修改对应的AtifactId和ModuleName。创建好的项目结构如下:

image.png

2.模块依赖

我们之前说过,View依赖Service,Service依赖Data,View、Service、Data共同依赖Common。所以我们需要修改各Module的build.gradle文件。
修改项目目录下的settings.gradle为

rootProject.name = 'SpringDemo'
include 'demo-common'
include 'demo-data'
include 'demo-service'
include 'demo-view'
  • rootProject.name 指定项目名称
  • 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等等几种依赖方式的区别。

2.5 主项目的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

由于每个Moudle下都会有application.properties文件,编译打包的时候会合并各个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文件,但是不能删除默认的application.properties文件。因为demo-view作为SpringBoot的启动Module。
    修改demo-view下的application.properties文件,引入各个Module下的properties文件
#导入application.properties
spring.profiles.active=\
  common,\
  data,\
  service,\
  view

3.项目配置

3.1 数据配置

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

3.1.1 数据库连接配置

在demo-data Moudle的application-data.properties文件下加入以下配置,这里也是最基本的配置,大家可以根据项目实际需求去修改数据库配置。

#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 创建实体类

在demo-data Module中创建entity包,创建一个User类。


image.png

3.1.3 创建Repository

在demo-data Module中创建repository包,创建一个UserRepository接口继承CrudRepository接口,并创建一个查询。通过username查找User。


image.png

3.2 Service创建

3.2.1 创建UserService接口,并创建相关方法。

image.png

3.2.2 创建UserServiceImpl类,实现UserService接口,加入@Service注解,并注入UserRepository。实现相关业务逻辑方法。

image.png

3.3 Controller创建

创建UserApi类,添加RestController注解,并且注入UserService。添加RESTful风格的api。


image.png

现在就可以跑起来了。直接执行DemoViewApplication中的Main方法。


image.png

现在测试接口
image.png

image.png

执行成功。并且数据也成功保存到数据库。现在这个简单的SpringBoot多模块项目就已经搭建好了。
现在就可以通过Gradle打包成jar包来执行。可以使用idea右侧工具栏的gradle工具,或者在控制台中使用Gradlew命令来执行打包。需要注意的是由于demo-view模块是启动模块,所以需要执行demo-view模块下的build和bootJar任务来打启动jar。

  • 命令方式


    image.png
  • 工具方式(需要执行demo-view模块下的任务)


    image.png

项目中gradle的配置比较简单,大家可以根据实际需求进行优化Gradle的配置。gradle的打可执行jar需要注意各模块间的依赖,启动模块以jar包的方式依赖其他模块。并且启动jar需要在demo-view模块中打包,也就是需要在启动模块,又入口main方法的模块进行打包。

项目github地址: https://github.com/BlueSkyYk/Demo-SpringMultipleModules

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容