- maven的聚合和继承是两个不同的特性(官网的说法),看懂spring cloud项目需要同时掌握聚合和继承的概念与设计模式中的基本概念一脉相承,以下用java类比弄清楚
- 了解maven 的独立安装及配置了解maven 生命周期了解maven 的spring boot插件spring-boot-maven-plugin 的命令行方式打包
- 开发者的spring cloud项目 – 微服务的项目开发者的spring boot项目 – 微服务架构中的子微服务开发者顶级的spring boot项目 – 微服务架构中有着统一配置作用的微服务spring boot框架 – spring团队开发的框架
单继承,由子类控制,group id 默认继承至父项目
group id 通常是指一个大项目的域名或唯一标识,一个spring cloud项目只有一个group idartifact id 具有实义的模块名,形如:spring-boot-starter-parent
spring boot框架的group id :org.springframework.boot
spring boot项目的group id : 项目开发者自定义,但是要统一
spring cloud项目的group id : 所有spring boot统一化配置的group id
当我们在选择spring cloud版本时,常常就是用一个spring boot项目作为版本管理的项目,即:
spring boot 2.5.x
||
微服务项目中顶级项目cloud 继承 spring boot 2.5.x ,并约定spring cloud版本
||
微服务的其他版本继承cloud项目, 并在约定好spring cloud 版本中选择套件
2.2 单继承下的子类pom 配置parent com.james 0.0.1-SNAPSHOT
father com.james 0.0.1-SNAPSHOT parent-eureka-server
顶级父类不需要写
类比 java
public class Parent { void dependencies(){} }
public class Son extends Parent{ }
2.3 spring boot 运用的继承关系
开发者的spring cloud项目 由 开发者的spring boot项目组成的,则开发者顶级的spring boot项目也是一个spring boot项目。
所以pom结构:开发者顶级的spring boot项目 继承 spring-boot-starter-parent
org.springframework.boot
spring-boot-starter-parent
2.5.8
com.james
cloud
0.0.1-SNAPSHOT
cloud
看继承关系中得到的依赖, 向上找父项目spring-boot-dependencies
org.springframework.boot spring-boot-dependencies 2.5.8 spring-boot-starter-parent pom spring-boot-starter-parent Parent pom providing dependency and plugin management for applications built with Maven
确定spring boot框架 最顶级的依赖是spring-boot-dependencies
spring-boot-dependencies 使用
区别于直接写
通过
总的来说,spring boot框架使用
3. 聚合 3.1 顶级父类pom配置org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
pom
cloud-order
cloud-eureka-server
cloud-supplier
类比 Java
public class Parent {
Son son;
Girl girl;
}
3.2 spring cloud 使用聚合实现被聚合项目的统一打包
在顶级项目目录执行
mvn package spring-boot:repackage
就可以在子项目cloud-eureka-server中执行。说明顶级项目聚合的子项目会跟着顶级项目一起打包
java -jar cloud-eureka-servertargetcloud-eureka-server-0.0.1-SNAPSHOT.jar4. 后记
maven的继承:建立起子类找父类的联系
maven的聚合:建立起父类找子类的联系
所以,spring cloud 中的所有spring boot项目都被整合起来了。
另外,maven的许多实验需要用命令行验证,idea的启动夹杂了很多私货不利于研究maven原理。这里贴以下idea 启动的命令行
java.exe -Dmaven.multiModuleProjectDirectory=D:cloud -Dmaven.home=D:maven3.8 -Dclassworlds.conf=D:maven3.8binm2.conf -Dmaven.ext.class.path=D:ideapluginsmavenlibmaven-event-listener.jar -javaagent:D:idealibidea_rt.jar=12953:D:ideabin -Dfile.encoding=UTF-8 -classpath D:maven3.8bootplexus-classworlds-2.6.0.jar;D:maven3.8bootplexus-classworlds.license org.codehaus.classworlds.Launcher -Didea.version=2020.3.2 -s D:maven3.8confsettings.xml -Dmaven.repo.local=D:maven3.8local_repository package4.1 普通
如果微服务架构中的子微服务都是web应用,可以在开发者顶级的spring boot项目中定义。则所有微服务都可以省略写这个依赖。
- 顶级的spring boot项目pom:
org.springframework.boot spring-boot-starter-web
- 子类的spring boot项目pom:
不用写,自动继承
- 顶级的spring boot项目pom:
org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
- 子类的spring boot项目pom:
写spring cloud 组件不需要制定版本号
4.3 相同原理的衍生org.springframework.cloud spring-cloud-starter-netflix-eureka-client
指定所有项目单独打包使用spring boot插件。同样的,需要隔离的话用
顶级的spring boot项目pom:
org.springframework.boot spring-boot-maven-plugin



