环境变量以及依赖问题

(注意保持版本等配置和教程完全保持一致)

前面主要是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=

再推送:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐