家政服务项目day0-环境、API、git
环境变量以及依赖问题
(注意保持版本等配置和教程完全保持一致)
前面主要是Maven环境变量的问题,我之前做过小程序的开发,环境变量设置在E盘,还没有改过来,我的内存有限,在跟着教程学习的时候,在D盘新建了Maven文件夹,发生了一系列报错。我先直接访问Maven官网,下载了教程里的版本的Maveb3.6.1,然后修改环境变量到D盘的Maven,重新构建项目,能够通过编译。
但是还有问题,我在启动前端项目的时候,登录不上,后端运行时报错地图、阿里云之类的配置有问题,因为教程至今有点久远了,我总不能自己买相关的服务器和api吧,所以我借助了codex的力量
以下为它的执行过程:
# 本地启动 jzo2o-publics 后端踩坑记录:从 MapService 缺失到端口占用
最近在本地启动 jzo2o-publics 服务时,目标很明确:先把后端服务跑起来,至于高德地图、阿里 OSS、微信、短信验证码这些外部
能力,暂时都可以先不接。
结果启动过程中连续踩了几类典型问题,这里按“报错现象 + 原因分析 + 解决方案”整理成一篇排障记录,方便后续自己或别人复用。
## 一、启动背景
启动模块:jzo2o-code/jzo2o-publics
启动命令:
mvn -q -DskipTests spring-boot:run
我的目标不是把所有第三方能力都配齐,而是让服务先能在本地启动并监听端口。
———
## 二、第一类报错:MapService Bean 找不到
### 报错现象
启动时报错:
APPLICATION FAILED TO START
Description:
A component required a bean of type 'com.jzo2o.thirdparty.core.map.MapService' that could not be found.
### 原因分析
jzo2o-publics 里的地图接口控制器直接注入了 MapService,但 MapService 的默认实现 AmapMapServiceImpl 只有在高德配置存在
时才会注册。
也就是说,本地如果没有开启:
amap.enable=true
那么 Spring 容器里根本不会有这个 Bean,应用启动直接失败。
### 解决方案
在 jzo2o-thirdparty 模块中增加一个本地兜底配置:
- 当 amap.enable 没开启时,注册一个 fallback MapService
- 这个 fallback 不参与真实业务,只是为了避免启动失败
- 如果真正调用地图接口,再抛出“地图服务未配置”的明确异常
对应处理文件:
- E:/YUNLAN/workspace/jzo2o/jzo2o-framework/jzo2o-thirdparty/src/main/java/com/jzo2o/thirdparty/config/
ThirdPartyFallbackConfiguration.java
### 处理思路
同样的思路也顺手覆盖了:
- StorageService(阿里 OSS)
- WechatService(微信)
这样本地即使不配第三方平台,也不会在启动阶段卡死。
———
## 三、第二类报错:WechatService / 第三方依赖继续缺失
### 报错现象
修完 MapService 后,继续报:
A component required a bean of type 'com.jzo2o.thirdparty.core.wechat.WechatService' that could not be found.
### 原因分析
本质和上面一样:
- 微信服务实现只在配置生效时注册
- 控制器又直接依赖接口
- 本地没有配置,就继续缺 Bean
### 解决方案
继续沿用 fallback 思路:
- 没有开启 tencent.wechat.enable=true 时,注册兜底 WechatService
- 没有开启 ali.oss.enable=true 时,注册兜底 StorageService
这样可以把“启动依赖”和“运行依赖”分开:
- 启动时不强依赖
- 真正访问功能时再报未配置
———
## 四、第三类报错:Redis / Redisson 启动强依赖
### 报错现象
第三方 Bean 处理完后,服务继续报:
Failed to instantiate [org.redisson.api.RedissonClient]
Unable to connect to Redis server: localhost/127.0.0.1:6379
后面又出现过:
A component required a bean named 'redisTemplate' that could not be found.
### 原因分析
本地没起 Redis,但项目中的 Redis 相关自动配置会在启动阶段直接初始化:
- RedissonClient
- 分布式锁切面
- Redis 缓存
- Redis 同步组件
- 短信验证码服务中的 RedisTemplate
这类组件一旦在启动期强依赖 Redis,本地就会直接起不来。
### 解决方案
我做了两步处理。
### 1. 在 dev 环境默认关闭 Redis 强依赖
修改:
- E:/YUNLAN/workspace/jzo2o/jzo2o-code/jzo2o-publics/src/main/resources/bootstrap-dev.yml
增加:
spring:
redis:
enabled: ${SPRING_REDIS_ENABLED:false}
意思是:
- 本地开发环境默认关闭 Redis 强依赖
- 如果以后想启用 Redis,只要设置 SPRING_REDIS_ENABLED=true 即可
### 2. 给 Redis 相关配置加条件装配
涉及文件:
- E:/YUNLAN/workspace/jzo2o/jzo2o-framework/jzo2o-redis/src/main/java/com/jzo2o/redis/config/
RedissonConfiguration.java
- E:/YUNLAN/workspace/jzo2o/jzo2o-framework/jzo2o-redis/src/main/java/com/jzo2o/redis/config/LockConfiguration.java
- E:/YUNLAN/workspace/jzo2o/jzo2o-framework/jzo2o-redis/src/main/java/com/jzo2o/redis/config/SpringCacheConfig.java
- E:/YUNLAN/workspace/jzo2o/jzo2o-framework/jzo2o-redis/src/main/java/com/jzo2o/redis/config/
RedisQueueSyncConfiguration.java
统一按 spring.redis.enabled 控制是否生效。
### 3. 给短信验证码服务补本地 fallback
因为 SmsCodeServiceImpl 直接依赖 RedisTemplate,所以也做了条件装配:
- Redis 开启时,用原实现
- Redis 关闭时,用本地 fallback 实现,避免启动失败
涉及文件:
- E:/YUNLAN/workspace/jzo2o/jzo2o-code/jzo2o-publics/src/main/java/com/jzo2o/publics/service/impl/
SmsCodeServiceImpl.java
- E:/YUNLAN/workspace/jzo2o/jzo2o-code/jzo2o-publics/src/main/java/com/jzo2o/publics/config/
LocalFallbackConfiguration.java
———
## 五、第四类问题:JVM 内存不足 / 页面文件太小
### 报错现象
后面启动时还碰到过:
There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (mmap) failed
页面文件太小,无法完成操作
### 原因分析
这不是 Spring 配置问题,而是本机 Java 进程可用内存不够,默认堆参数偏大。
### 解决方案
启动时显式限制 JVM 堆大小:
set MAVEN_OPTS=-Xms128m -Xmx256m && mvn -q -DskipTests spring-boot:run
这个命令在本地更稳,尤其是 Windows 环境内存紧张时。
———
## 六、第五类报错:端口 11503 被占用
### 报错现象
服务已经能起来之后,再次启动会报:
Web server failed to start. Port 11503 was already in use.
### 原因分析
上一次启动成功后,旧的 Java 进程还在运行,占用了 11503 端口。
### 解决方案
先查端口:
netstat -ano | findstr :11503
会看到类似:
TCP 0.0.0.0:11503 0.0.0.0:0 LISTENING 54484
然后杀掉对应进程:
taskkill /PID 54484 /F
再确认端口已释放:
netstat -ano | findstr :11503
没有输出就说明端口已经空了。
———
## 七、最终启动命令
本地推荐直接用:
set MAVEN_OPTS=-Xms128m -Xmx256m && mvn -q -DskipTests spring-boot:run
如果之前有旧进程占端口,先执行:
netstat -ano | findstr :11503
taskkill /PID <PID> /F
———
## 八、最终结果验证
服务成功监听:
0.0.0.0:11503 LISTENING
并且我实际请求了接口:
curl http://127.0.0.1:11503/publics/map/regeo?location=116.397428,39.90923
返回了正常 JSON,说明服务已经真正启动成功,而不是只停留在“端口打开”。
———
## 九、这次排障的核心结论
这次问题的本质,不是某一个单点报错,而是本地启动环境和线上依赖模型不一致:
- 控制器直接依赖第三方服务接口
- Redis、Redisson、短信等组件在启动阶段强依赖基础设施
- 本地没配这些依赖时,应用就会在 Spring 初始化阶段失败
正确的本地启动思路应该是:
- 把第三方能力改成可降级
- 把外部中间件依赖改成可关闭
- 把“启动成功”和“功能可用”拆开
这样本地开发才能先跑通主流程,再逐步补齐外部依赖。
———
## 十、适合本地开发的最终状态
当前本地模式下:
- jzo2o-publics 可以先启动
- 地图、OSS、微信、短信等能力未配置时不会阻塞启动
- 真正访问这些能力时,会返回明确的“未配置”错误
- 如果后续要恢复 Redis,只需设置:
set SPRING_REDIS_ENABLED=true
然后再补 Redis 配置即可。
之后成功登录进入系统

Git推送报错
fatal: unable to access 'https://github.com/luohong1221-cloud/jzo2o-code.git/':
schannel: failed to receive handshake, SSL/TLS connection failed
系统环境变量带了代理(使用魔法需要这样设置:HTTP_PROXY=http://127.0.0.1:7897)
先临时清掉当前终端里的代理:
set http_proxy=
set https_proxy=
再推送:

更多推荐



所有评论(0)