背景
一个多模块项目,多人协作开发。parent继承 spring-boot-starter-parent
目录结构
parent
├── common //普通maven模块,存放一些公用的静态代码、枚举、字符串常量等
│ └── src
├── demo //SpringBoot模块,一个调用api模块的演示项目
│ ├── pom.xml
│ └── src
├── api //SpringBoot模块,核心业务系统,对外暴露Restful API
│ ├── pom.xml
│ └── src
└── pom.xml
模块依赖现状
- demo没有依赖其他模块
- api -依赖于-> common模块
新模块来了
新需求
- 要新增一个管理后台,前后端分离,用于查看核心业务系统api的运作情况,后期增加各种可视化,预警信息等功能。模块名admin
parent
├── admin //SpringBoot模块
│ ├── pom.xml
│ └── src
├── common //普通Maven模块,存放一些公用的静态代码、枚举、字符串常量等
│ └── src
├── demo //SpringBoot模块,一个调用api模块的演示项目
│ ├── pom.xml
│ └── src
├── api //SpringBoot模块,核心业务系统,对外暴露Restful API
│ ├── pom.xml
│ └── src
└── pom.xml
新模块设计
设计阶段:除了后台管理系统必须的rbac权限、常规异常处理、日志等基础功能外,所有功能都围绕api模块的业务展开。
理想情况:为了保证代码一致性,这部分domain、repository都要与api模块一致。第一反应是想把这些代码抽取到common模块,api、admin各自依赖common模块
实际情况:api模块仍在快速迭代阶段,每天有大量的commit、pull request,此时将代码拆分,推送到主分支,会给所有人的代码合并增加工作量。只能放弃,采取模块间依赖
新模块开发
- admin/pom.xml 增加内容
<dependencies>
<dependency>
<groupId>com.company.project</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 省略其他依赖 -->
</dependencies>
- 新模块面向用户是我们自己,有需求再加。现阶段需求简单,开发顺利。
- 计划在下一次api版本发布时,将admin一同发布上线。
准备上线
最后检查一下业务代码,本地IDEA跑admin+api两个SpringBoot,验证功能一切正常,岁月静好。
部署步骤是github ci脚本编写的,大致流程
打jar包 -> 打DockerImage -> 推送到公司DockerHub -> ssh到部署机器 -> docker-compose pull -> docker-compose up -d
其他步骤基本都不用动,也就是说只要第一步打出来jar包没问题就行。
打算本地按照ci脚本的步骤验证下,手动打包,然后通过java -jar启动
- 在parent下执行
maven package,执行到admin模块时,编译器马上报错
[INFO] ------------------------< com.company.project:admin >------------------------
[INFO] Building admin 0.0.1-SNAPSHOT [5/5]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ admin ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 3 resources
[INFO] Copying 16 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ admin ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 270 source files to /Users/fakepath/parent/admin/src/main/java/com/company/project/admin/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/fakepath/parent/admin/src/main/java/com/company/project/admin/modules/paas/service/impl/SomeServiceImpl.java:[11,33] 程序包com.company.project.model.user不存在
懵逼(-_-)!!
检查admin/pom.xml,无误
maven clean再试一次。❌无效
清除文件缓存,重启idea。❌无效
java -jar api.jar --spring.profiles.active=local,api启动成功。
目前状况:api模块的包打成功了,但是admin无法正常引用,问题大致定位在了api.jar身上
搜之……等到浏览器tab密密麻麻之后,获得信息“spring boot的jar包不是一般的jar包” Spring官方文档
下集预告
核心业务模块!挂了!!!
终于打包成功,结果发布的时候出了新状况!