# V1 与 V2 电梯应用依赖:详细比对说明 本文说明 **V1 历史运行包** 与 **V2 Maven 反应堆** 在依赖上的对应关系、已核对的一致项、已知差异与后续可执行动作。比对以仓库内 `**cw-elevator-application-V1.0.0.20211103`** 为 V1 基线。 --- ## 1. V1 运行包 classpath 结构(与 V2 可执行 JAR 的对应) | 位置 | 路径 | 数量 | 含义 | | -------------------- | ------------------------------------------------------ | ------- | --------------------------------------------------------------------------------- | | **第三方与 Spring 栈** | `cw-elevator-application-V1.0.0.20211103/lib/*.jar` | **245** | 与 Boot 1.5、Spring Cloud、MyBatis、Netty、Feign 等一致;文件名即 **artifactId-version** 形态为主。 | | **云从 + 电梯模块 + 智能组件** | `cw-elevator-application-V1.0.0.20211103/cw_lib/*.jar` | **24** | 与 V2 `pom.xml` 中 **显式声明版本** 的坐标对齐;电梯四模块以 **1.0-SNAPSHOT** JAR 形式落盘。 | V2 可执行包由 `spring-boot-maven-plugin` repackage 后,上述两类依赖会进入 `**BOOT-INF/lib/`**;概念上 **V2 ≈ cw_lib ∪ lib 的传递闭包**,但 **具体 JAR 列表以 Maven 解析结果为准**。 **完整文件名清单(机器可读)**: - `docs/architecture/data/v1-elevator-lib-jars.txt`(245 行) - `docs/architecture/data/v1-elevator-cw-lib-jars.txt`(24 行) --- ## 2. `cw_lib`(24)与 V2 反应堆版本:逐项一致 下列 JAR 在 V1 `cw_lib` 中的 **文件名** 与 V2 `maven-cw-elevator-application/pom.xml` 的 `` / `dependencyManagement` **一致**(脚本已自动核对): | # | V1 `cw_lib` 文件名 | V2 约束来源 | | --- | --------------------------------------------------------- | ----------------------------------------------------------------------------- | | 1 | `cloudwalk-common-event-3.7.2-Brussels-SRX.jar` | `cloudwalk.internal.version` | | 2 | `cloudwalk-common-result-3.7.2-Brussels-SRX.jar` | `cloudwalk.legacy.public.version` | | 3 | `cloudwalk-common-serial-3.7.2-Brussels-SRX.jar` | `cloudwalk.legacy.public.version` | | 4 | `cloudwalk-common-service-3.7.2-Brussels-SRX.jar` | `cloudwalk.internal.version` | | 5 | `cloudwalk-common-web-3.7.2-Brussels-SRX.jar` | `cloudwalk.legacy.public.version` | | 6 | `cloudwalk-device-manager-common-2.0.2.jar` | V1 随包固定;V2 由 `**intelligent-cwoscomponent-rest`** 等传递引入(反应堆未单独 pin 版本,以解析树为准) | | 7 | `cloudwalk-device-manager-interface-2.0.2.jar` | 同上 | | 8 | `cloudwalk-device-sdk-protocol-entity-2.2.0.jar` | 同上 | | 9 | `cloudwalk-intelligent-component-lock-1.1.1-SNAPSHOT.jar` | `intelligent.lock.version` | | 10 | `cw-elevator-application-common-1.0-SNAPSHOT.jar` | V2:`cn.cloudwalk.elevator:cw-elevator-application-common:**2.0-SNAPSHOT`** | | 11 | `cw-elevator-application-data-1.0-SNAPSHOT.jar` | V2:`…-data:**2.0-SNAPSHOT`** | | 12 | `cw-elevator-application-service-1.0-SNAPSHOT.jar` | V2:`…-service:**2.0-SNAPSHOT**` | | 13 | `cw-elevator-application-web-1.0-SNAPSHOT.jar` | V2:`…-web:**2.0-SNAPSHOT**` | | 14 | `cwos-common-aks-interface-1.0.0-SNAPSHOT.jar` | V1 随包;V2 若未在反应堆显式声明则来自传递依赖 | | 15 | `cwos-component-resource-data-1.0.0-SNAPSHOT.jar` | 同上 | | 16 | `cwos-component-resource-interface-1.0.0-SNAPSHOT.jar` | 同上 | | 17 | `cwos-device-authentication-interface-1.0.0-SNAPSHOT.jar` | 同上 | | 18 | `cwos-java-sdk-resource-1.0.0-SNAPSHOT.jar` | `cwos.sdk.resource.version` | | 19 | `cwos-portal-interface-1.0.0-SNAPSHOT.jar` | V1 随包;V2 传递 | | 20 | `cwos-sdk-event-1.5.0-SNAPSHOT.jar` | `cwos.sdk.event.version` | | 21 | `davinci-manager-common-1.1.7-SNAPSHOT.jar` | 与 `davinci-manager-storage` 同族 | | 22 | `davinci-manager-storage-1.1.7-SNAPSHOT.jar` | `davinci.manager.storage.version` | | 23 | `intelligent-cwoscomponent-interface-2.9.2-xinghewan.jar` | `intelligent.cwoscomponent.version` | | 24 | `intelligent-cwoscomponent-rest-2.9.2-xinghewan.jar` | `intelligent.cwoscomponent.version` | **结论(云从/智能主干)**:与对拍、校验切面相关的 `**cloudwalk-common-*` 3.7.2-Brussels-SRX** 与 `**intelligent-cwoscomponent-*` 2.9.2-xinghewan** 等,**V1 cw_lib 与 V2 POM 显式口径一致**;对拍行为差异 **不宜** 首先归因于「cloudwalk 主版本不一致」。 **电梯自研模块**:V1 为 **1.0-SNAPSHOT** 四 JAR,V2 反应堆为 **2.0-SNAPSHOT** —— 属 **预期版本升级**,需用源码白名单比对(见 `V1-V2-电梯API源码比对白名单.md`),而非依赖坐标「偷偷不一致」。 --- ## 3. V1 `lib`(245)与 V2 `dependencyManagement`:显式对齐项 V2 反应堆在 `` 中 **主动钉死**、且与 V1 `lib` 中 **常见文件名** 对齐的第三方包括(节选): | 属性 | 值 | V1 `lib` 中典型 JAR | | ------------------------------------------------------- | --------------- | --------------------------------------------- | | `fastjson.version` | 1.2.73 | `fastjson-1.2.73.jar` | | `guava.version` | 20.0 | `guava-20.0.jar` | | `poi.version` | 3.15 | `poi-3.15.jar`、`poi-ooxml-3.15.jar` | | `ant.version` | 1.9.6 | 见下节「多版本」 | | `mybatis-spring-boot.version` | 1.3.1 | `mybatis-spring-boot-starter-1.3.1.jar` | | `pagehelper.version` / `pagehelper-spring-boot.version` | 5.1.2 / 1.2.5 | `pagehelper-5.1.2.jar` 等 | | `shardingsphere.version` | 4.0.0 | `sharding-jdbc-spring-boot-starter-4.0.0.jar` | | `spring-cloud.version` | **Edgware.SR6** | 见下节 | **Spring Boot**:V2 父 POM 为 `**spring-boot-starter-parent` 1.5.17.RELEASE**;V1 `lib` 中可见 `**spring-boot-*-1.5.17.RELEASE.jar`**,主版本一致。 --- ## 4. V1 `lib` 中的「多版本并存」风险(V2 由 BOM 收敛) 对 `lib` 内文件名做 **artifact 前缀聚合** 后,典型 **多版本** 包括: | 前缀 | 并存版本(示例) | 说明 | | ------------ | --------------- | ------------------------------------------------------------------- | | `feign-core` | 8.18.0 与 9.5.0 | 历史传递与 Netflix/OpenFeign 栈叠加;**实际生效顺序依赖 fat JAR Class-Path / 装载顺序**。 | | `ant` | 1.6.5 与 1.9.6 等 | V2 反应堆仅钉 `**ant.version` = 1.9.6**;V1 物理目录仍含旧 ant。 | | `rxjava` | 1.x 与 2.x | 常见于 Netflix + 其它客户端并存。 | V2 由 `**spring-boot-dependencies` + `spring-cloud-dependencies`(Edgware.SR6)** 统一解析,**理论上** 比「手工铺 245 个 jar」更可重复;若需 **字节级** 证明与 V1 运行时一致,应在 **同一 JDK** 下导出 `**mvn dependency:tree`** 与 V1 进程 `**jcmd VM.classloader_hierarchy`** / 或解压 fat JAR 的 `BOOT-INF/lib` 做集合 diff。 --- ## 5. V2 反应堆「直接依赖」模块一览(非传递闭包) | 模块 | 直接引入的典型坐标(无版本处由 `dependencyManagement` 解析) | | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `cw-elevator-application-starter` | `spring-boot-starter-web`、MyBatis、Actuator、Cache、AOP、OpenFeign、`cw-elevator-application-web` | | `cw-elevator-application-web` | `cloudwalk-common-web`、`cw-elevator-application-service` | | `cw-elevator-application-service` | `cloudwalk-common-service`、`spring-tx`、`cloudwalk-common-serial`、`cwos-java-sdk-resource`、`jackson-datatype-jsr310`、`cloudwalk-intelligent-component-lock`、`cloudwalk-common-event`、`cwos-sdk-event`、`cw-elevator-application-data`、`davinci-manager-storage`、`intelligent-cwoscomponent-rest`、`spring-cloud-starter-openfeign`、`javax.annotation-api`、`jsr305` | | `cw-elevator-application-common` | `cloudwalk-common-result`、Guava、POI、Ant、thumbnailator、`commons-io`、fastjson、`tomcat-embed-core`、`cloudwalk-common-web`、`spring-boot-autoconfigure`、`commons-lang3`、ZXing、zip4j、`spring-web`、`spring-data-redis`、lombok、`jackson-datatype-jsr310` | | `cw-elevator-application-data` | `cw-elevator-application-common`、`cloudwalk-common-result`、`spring-beans`/`context`、MyBatis、mysql、`mybatis-spring-boot-starter`、HikariCP、pagehelper、shardingsphere | **与 V1 的差异点**:V2 `**cw-elevator-application-common`** 显式增加 `**spring-boot-autoconfigure`**(见模块内注释:私服上 `cloudwalk-common-web` 传递不完整时的 **编译 classpath 补齐**)。V1 若完全依赖传递,**编译期/工具链** 与 V2 可能略有不同,但 **运行时** 通常仍由 Boot 引入同一类库。 --- ## 5.1 反应堆子模块报「在 nexus-public 找不到 sibling SNAPSHOT」 **现象**:`data` 拉 `cw-elevator-application-common`、`web` 拉 `service` 等,日志只出现 `Downloading from nexus-public: .../elevator/...`。 **原因**:全局 `~/.m2/settings.xml` 中 `**mirrorOf=*`**(或等价过宽)时,Maven 易把 **本反应堆未发布到私服的 SNAPSHOT** 也导向 Nexus,导致失败。**不需要**为此逐个 `deploy` 电梯子模块到私服。 **本仓库已落盘**:`maven-cw-elevator-application/.mvn/maven.config` + `.mvn/settings.xml`:用 `-s` **绕过** `~/.m2`;profile 激活 `**nexus-public`(http)**;并含 一条 `id=maven-default-http-blocker`、`mirrorOf=dummy` 的占位 ``,用于覆盖 Maven 3.8.1+ 安装目录里对 `**external:http:*`** 的默认拦截(否则会出现 `Blocked mirror for repositories: [nexus-public (...http...)]`)。**不是** `mirrorOf=*`,不会把反应堆 sibling 整体导向私服。私服若需账号,请在 `.mvn/settings.xml` 内补 ``(勿提交密钥)。若 Nexus 已支持 **HTTPS**,更推荐改仓库 URL 为 `https://` 并删除该占位 mirror。 **隔离构建**:`./scripts/build_nexus_only.sh` 会额外 `purge` `**cn/cloudwalk/elevator`** 下 `*.lastUpdated`,并在使用 `clean install` 时把 sibling 写入隔离库。 --- ## 6. 生成「V2 全量传递依赖树」与与 V1 的集合 diff(推荐下一步) 当前环境若 **无法安装反应堆子模块** 或 **无法访问 Nexus**,则无法在 CI 外自动生成 **V2 完整 245+ 级传递树**。请在 **可解析依赖** 的环境、于 `**maven-cw-elevator-application` 根**执行(**自动使用 `.mvn/settings.xml`**;与 `build_nexus_only.sh` 对齐隔离库时可加 `-Dmaven.repo.local=$PWD/.m2-elevator-nexus-only`): ```bash cd maven-cw-elevator-application mvn -pl cw-elevator-application-starter -am -DskipTests clean install mvn -pl cw-elevator-application-starter -am -DskipTests dependency:tree \ -DoutputFile=cw-elevator-application-starter/target/v2-starter-dependency-tree.txt ``` 然后将 `**target/v2-starter-dependency-tree.txt**` 中的 `groupId:artifactId:jar:version` 与 `**docs/architecture/data/v1-elevator-lib-jars.txt**` 做集合差集(仅 artifactId-version 对齐即可),即可得到 **「V2 有而 V1 lib 无」** 与 **「V1 lib 有而 V2 未解析到」** 的完整列表。 --- ## 7. 自动化脚本(可重复输出摘要) 仓库根目录执行: ```bash python3 scripts/compare_v1_v2_elevator_dependencies.py ``` 将打印:`cw_lib` 与 V2 属性对齐核对、V1 `lib` 多版本示例、以及生成 `dependency:tree` 的 Maven 命令提示。 --- ## 8. 总括结论(供评估「下一步计划」) 1. **云从公共件 + intelligent 2.9.2 + davinci/cwos 等与对拍强相关的坐标**:V1 `cw_lib` 与 V2 `pom.xml` **已对齐**。 2. **电梯四模块**:V1 **1.0-SNAPSHOT** JAR vs V2 **2.0-SNAPSHOT** 源码 —— **预期差异**,行为差应结合 **源码白名单 diff + 运行时** 看。 3. **245 个第三方 JAR**:V2 由 **Boot 1.5.17 + Cloud Edgware.SR6 BOM** 收敛;V1 物理目录存在 **Feign/Ant/RxJava 多版本**,**与「仅业务源码不同」假设不完全相容** —— 若要对齐到「与 V1 进程 classpath 完全一致」,需 **依赖树 diff**,不能只盯 `cw_lib`。 4. **下一步建议优先级**:① 在 CI 生成并归档 `**dependency:tree`**;② 与 `v1-elevator-lib-jars.txt` 做 **差集报告**;③ 对差集中 **多版本冲突** 项做 **运行时类加载验证**(仅静态比对不足以解释偶发 NPE/空响应)。 --- ## 相关文档 - API 调用链源码比对白名单:`V1-V2-电梯API源码比对白名单.md` - 对拍与根因说明:`../../maven-cw-elevator-application/tools/elevator_api_parity/API-RECONCILIATION.md`