# 组织组件:部署包 vs 源码批量对比与 javap 单类语义对照 > **已 supersede:** 全量 `**src/main/java`(582 文件)** 逐类 `javap` 核对、清单与解决方案见 > `[2026-05-06-component-org-full-java-audit-and-remediation.md](./2026-05-06-component-org-full-java-audit-and-remediation.md)` > 及 `maven-ninca-common-component-organization/tools/out/deploy_javap_audit_main.json`。 **日期:** 2026-05-06 **部署包根路径:** `星河湾星中星/部署包/ninca_common_component_organization_01-ninca_common_component_organization` **源码反应堆:** `源码/maven-ninca-common-component-organization` **本地构建:** `mvn -DskipTests package`(对比时使用各模块 `target/*.jar` 与 Starter Fat JAR) --- ## 1. 批量对比摘要(Lua / 配置 / JAR) | 类别 | 结论 | | ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Lua**(`service/.../lua` ↔ 部署 `BOOT-INF/classes/lua`) | `diff -rq` 无差异,9 个脚本一致。 | | **配置** | 根目录 `application.properties` 与 `BOOT-INF/classes` 仍有多层覆盖差异;根目录存在无效行 `新增配置`(应改为 `#` 注释)。`generator*.xml` 仅在现场包内,仓库无同名 `src/main/resources`。 | | **四模块 JAR** | 与部署 `BOOT-INF/lib` 中 `*-v2.9.2_xinghewan.jar` 逐 entry SHA-256 比对:**绝大多数 `.class` 哈希不同**;另见接口 JAR 多 `component-org/messages*.properties`,Data JAR 多 `mapper/mysql/*.xml` 而仓库 data 模块未提交对应 XML。 | | **Starter** | 现场 `BOOT-INF/classes` 含大量 config/kafka 等 `**.class`**;仓库 `starter` 仅 `**OrganizationServer.java**`,编译产物几乎只有 `**OrganizationServer.class**`。 | | **Fat JAR** | 现场 `...20210730.jar`(约 116MB)与本地 `ninca-common-component-organization-2.9.2-xinghewan.jar`(约 96MB)**SHA-256 不同**,依赖与打包体积不一致。 | --- ## 2. javap 对照方法 - **命令:** `javap -p -classpath <全限定类名>` - **含义:** 打印编译期可见的类签名、字段、方法(含 private),用于 **API 形状** 对照;**不**等价于字节码逐条指令一致(需 `javap -c` 或 `javap -v`)。 - **部署侧类路径:** 优先从解压目录 `.../BOOT-INF/classes` 加载(如 `OrganizationServer`);其余类从现场四模块 JAR 组成的 classpath 加载。 - **本地侧:** Starter 类从 `cwos-component-organization-starter/target/classes`;其余从本地四模块 `target/*.jar`。 --- ## 3. 抽样类:javap 是否一致 | 类 | javap(`-p`)结果 | | ----------------------------------------------------------------------- | ------------------------------- | | `cn.cloudwalk.starter.organization.OrganizationServer` | **不一致**(见下节) | | `cn.cloudwalk.web.organization.controller.PersonController` | **完全一致** | | `cn.cloudwalk.web.organization.controller.CpOrgDeviceKitController` | **完全一致** | | `cn.cloudwalk.service.organization.service.ImgPersonServiceImpl` | **不一致**(见下节) | | `cn.cloudwalk.service.organization.service.CpImageStoreToolServiceImpl` | **不一致**(见下节;差异仅在合成 lambda 方法签名) | --- ## 4. 差异详情:`diff -u`(javap 输出) ### 4.1 `OrganizationServer` 现场类继承 `SpringBootServletInitializer` 并实现 `WebApplicationInitializer`,且含 `RestTemplate`、`MeterRegistryCustomizer`、`configure(SpringApplicationBuilder)` 等;本地类为 **普通类**,仅 `main` 与 `**cloudwalkSessionContextHolder()`** Bean 方法,**无 WAR 引导与 Micrometer 相关成员**。 ```diff --- deploy javap +++ local javap @@ -1,12 +1,6 @@ Compiled from "OrganizationServer.java" -public class cn.cloudwalk.starter.organization.OrganizationServer extends org.springframework.boot.web.support.SpringBootServletInitializer implements org.springframework.web.WebApplicationInitializer { - private static org.slf4j.Logger log; - org.springframework.data.redis.core.StringRedisTemplate stringRedisTemplate; +public class cn.cloudwalk.starter.organization.OrganizationServer { public cn.cloudwalk.starter.organization.OrganizationServer(); + public cn.cloudwalk.cloud.context.CloudwalkSessionContextHolder cloudwalkSessionContextHolder(); public static void main(java.lang.String[]); - org.springframework.web.client.RestTemplate restTemplate(); - public org.springframework.web.client.RestTemplate getWebClient(); - io.micrometer.spring.autoconfigure.MeterRegistryCustomizer configurer(java.lang.String); - protected org.springframework.boot.builder.SpringApplicationBuilder configure(org.springframework.boot.builder.SpringApplicationBuilder); - static {}; } ``` **解读:** 本地 Starter 与现场 **入口形态不一致**;若要以现场为准,需将完整 Starter 源码迁回仓库后再比对。 --- ### 4.2 `ImgPersonServiceImpl` 本地相对现场 **多出** 租户访客楼层策略依赖与两个私有辅助方法(与仓库内访客楼层策略改造一致)。 ```diff --- deploy javap +++ local javap @@ -23,6 +23,7 @@ private org.springframework.context.MessageSource messageSource; private cn.cloudwalk.service.organization.service.feign.ZoneFeignClient zoneFeignClient; + private cn.cloudwalk.service.organization.policy.TenantVisitorFloorPolicyService tenantVisitorFloorPolicyService; @@ -56,6 +57,8 @@ public cn.cloudwalk.cloud.result.CloudwalkResult syncAccountUnbind(...); + private java.lang.String buildCommaSeparatedFloorNames(java.lang.String, java.util.List); + private java.util.List buildFloorInfoListFromOrderedZoneIds(java.lang.String, java.util.List); private void saveSysLog(...); ``` **解读:** **源码侧领先于现场 JAR**(功能扩展);非「仅编译器噪声」。 --- ### 4.3 `CpImageStoreToolServiceImpl` 差异仅体现在 **lambda 合成方法** `lambda$batchRemoveFace$5` 的参数列表(少一个 `BatchRemoveFaceParam`)。公开 API 未在上面的片段中变化,通常与 **同一源码重新编译后 lambda 编号/捕获变量** 有关,需结合 `-c` 或业务测试确认行为是否等价。 ```diff --- deploy javap +++ local javap @@ -36,7 +36,7 @@ - private static void lambda$batchRemoveFace$5(cn.cloudwalk.client.organization.param.BatchRemoveFaceParam, cn.cloudwalk.client.organization.service.store.param.CpBatchHandleFaceParam, java.util.List, java.lang.String); + private static void lambda$batchRemoveFace$5(cn.cloudwalk.client.organization.service.store.param.CpBatchHandleFaceParam, java.util.List, java.lang.String); ``` --- ## 5. 结论与建议 1. **PersonController / CpOrgDeviceKitController** 在 **方法签名层面** 与现场一致,与「几乎全部 class 文件哈希不同」并存时,说明 **大量差异来自编译环境或调试信息**,而非必然的业务接口变更。 2. **OrganizationServer** 与现场 **语义层面不一致**,与仓库 Starter 仅保留最小入口一致,属 **结构性缺口**。 3. **ImgPersonServiceImpl** 差异反映 **源码已增加租户访客楼层策略**,现场包未包含时需 **升级发布** 才能对齐。 4. 后续若要扩大 javap 覆盖面:可对 **变更集中的 Service** 再跑同一脚本;若需 **指令级** 一致,对关键方法追加 `javap -c` 对比。 --- ## 6. 复现命令(节选) ```bash DEPLOY_LIB=".../ninca-common-component-organization-V2.9.2_20210730/BOOT-INF/lib" D_CP="$DEPLOY_LIB/cwos-component-organization-web-v2.9.2_xinghewan.jar:..." DEPLOY_CLS=".../BOOT-INF/classes" L_CP=".../cwos-component-organization-web/target/...jar:..." javap -p -classpath "$DEPLOY_CLS" cn.cloudwalk.starter.organization.OrganizationServer javap -p -classpath ".../cwos-component-organization-starter/target/classes" cn.cloudwalk.starter.organization.OrganizationServer ``` (将 `...` 替换为本机完整路径。)