开始改造之前写的单机springboot项目的时候,在用gradle创建多层级项目的时候就遇到了问题,csdn+google的中文社区都没有找到解决办法,最后通过官方文档解决(麻了)
在此记录
示例项目地址:https://github.com/MomentDerek/teamsystem-cloud-template
父项目初始化
首先,创建项目后立马暂停依赖的自动下载,开始编辑依赖:
本文的参考gradle为7.4,6.x版本会有部分api区别(主要体现在dependencyManagement的mavenBom及其相关插件名称上,但应该是直接能用的,6.4.1编译通过)
初始build.gradle记录:
plugins {
id 'org.springframework.boot' version '2.3.12.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}
allprojects {
repositories {
maven {
url 'https://maven.aliyun.com/repository/central'
}
mavenCentral()
}
}
subprojects {
ext {
springBootVersion = "2.3.12.RELEASE"
springCloudVersion = "Hoxton.SR12"
springCloudAlibabaVersion = "2.2.7.RELEASE"
lombokVersion = "1.18.22"
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven-publish'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
// java编译的时候缺省状态下会因为中文字符而失败
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation "org.springframework.boot:spring-boot-starter-web"
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation "com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery"
implementation "org.springframework.cloud:spring-cloud-starter-openfeign"
//lombok
compileOnly "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
}
}
test {
useJUnitPlatform()
}
}
编辑完build.gradle后开始下载依赖
然后删除多余的src文件夹及其他多余文件
创建多级子模块
创建gradle子模块,取消所有框架的勾选
父项选择父模块
如果还有三级子模块需要创建,则继续,否则创建完成(idea会帮你完成二级父子项目的配置,这里应该是没坑的)
在子模块上右键新建模块,这里父项需要为None(可以观察一下位置的路径,需要在子模块的下面创建三级子模块)
创建后删除多余的文件夹,只留build.gradle和settings.gradle
创建完成的样子如下
然后编辑父模块的settings.gradle,加入所有子模块:
rootProject.name = 'teamsystem-cloud'
include 'teamsystem-api'
include 'teamsystem-api:teamsystem-feign'
include 'teamsystem-api:teamsystem-consumer-test'
include 'teamsystem-api:teamsystem-provider-test'
此时有个非常非常重要的步骤,在idea的gradle窗口中把除父项目的gradle编译项全部删掉!
因为在gradle刷新后会自动在父模块下创建子模块的编译项
解决子模块之间的依赖问题
如上面创建的项目,consumer-test和provider-test依赖于feign模块的接口,而feign本身没有启动项,那么此时,需要如下编辑各个模块的build.gradle
首先要在feign的build.gradle中加入jar.enabled=true
,否则无法被其他两个子模块依赖(因为没有启动类,默认不会被编译成jar包)
然后是在consumer-test和provider-test中加入feign模块的依赖
dependencies {
implementation project(':teamsystem-api:teamsystem-feign')
}
完成后同步依赖即可完成创建
结果
应该如下(子模块的settings.gradle可以删掉,目前没有太大的影响)