本博客源码可在Gitee上下载。
我们已经将Eureka Service工程和Gateway工程分别做成了demo-springcloud工程的两个模块,到这有一个不大不小的问题:
有一些配置及依赖是每个模块都会用到的,难道每新建一个模块都要重新拷贝一遍配置?
答案当然是NoNoNo!我们可以把一些通用的配置及依赖项抽象到父级模块(或者顶级的工程)下,接下来我们就抽一下eureka和gateway这两个模块。
我们用idea自带的对比工具对比一下eureka和gateway中的build.gradle文件,如下图所示,发现这两个文件中有很多一样的地方,比如plugins、group、依赖仓库配置和springcloud的版本变量配置等等,这些都是可以不用重复设置的。
我们可以将通用的配置转移到父级,也就是工程级别的build.gradle文件中,作为全局配置,首先是插件配置plugins:
拷贝过来后,就可以把原来的plugins删掉了。
接下来是spring cloud版本号,拷过来后同时删除原来两个模块中的设置。
上面两处配置是全局配置,是整个工程都会使用的配置,接下来我们配置点不一样的。
subprojects
在subprojects块内的配置表示所有子模块都会使用的配置,其中就包括通用的依赖项。
这里配置了3部分:
第一部分,apply plugin。前面在plugins块中声明了三个插件,我们需要在每个子模块中使用他们。
第二部分,group。所有微服务都由同一家公司开发(鄙人不才,正是在下),所以group肯定要统一。
第三部分,repositories依赖仓库。所有模块当然使用相同的依赖仓库配置,除了mavenCentral,也可以添加国内的仓库镜像配置。
配置好这些后,记得在子模块中删掉对应的配置。
接下来继续在subprojects中添加内容,添加好后不要忘了将子模块中相同的部分删掉。
最后子模块只保留各自独特的部分。
附上完整的三个build.gradle代码:
project build.gradle
plugins {
id 'java'
// spring 依赖管理插件
// https://plugins.gradle.org/plugin/io.spring.dependency-management
id 'io.spring.dependency-management' version '1.1.6'
// spring boot系列版本,不需最新,与mavenBom依赖的版本相同就好
id 'org.springframework.boot' version '3.2.6'
}
ext {
// spring cloud套装版本号
// 在 https://mvnrepository.com/ 搜spring-cloud-dependencies可以找到版本列表
set('springCloudVersion', "2023.0.2")
}
subprojects {
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.hao1st'
repositories {
mavenCentral()
}
// 编译和打包时将xml文件也一同编译,idea可用
sourceSets.main.resources.srcDirs=["src/main/java","src/main/resources"]
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
}
eureka build.gradle
version = '0.0.1-SNAPSHOT'
dependencies {
// --- Spring cloud starter ---
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
// --- Spring boot starter ---
implementation 'org.springframework.boot:spring-boot-starter-security'
}
gateway build.gradle
version = '0.0.1-SNAPSHOT'
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
怎么样,抽象出来之后,各子模块只需要管理自己独有的依赖项就好了,是不是很方便?
最后的最后,一次运行eureka模块和gateway模块,访问eureka面板界面,效果如下: