该技能用于把仅存在于 Neo 环境的 Neo Java Web API 替换为 SAP Cloud SDK,使应用可以在 Cloud Foundry(CF)中运行。Neo Java Web API(com.sap.cloud:neo-java-web-api)在 CF 中不可用,本技能用提供等效功能的 SAP Cloud SDK 依赖替代它。
触发条件:当 pom.xml 中出现 groupId 为 com.sap.cloud、artifactId 为 neo-java-web-api 的依赖,或 Java 源码中出现 com.sap.cloud.account.、com.sap.core.connectivity.api.、com.sap.security.um.user.* 等导入时,本技能适用。
前提条件:技能必须在应用的 -cf-migration 副本目录内运行(由 jakarta-java25-migration 或 neo-to-cf-migration-orchestrator 创建)。若当前目录不以 -cf-migration 结尾,需先切换。调用前须先执行 jakarta-java25-migration(迁移到 Java 25 与 Jakarta EE 10),这是本技能的必需前置。
转换步骤: 第 1 步,从 pom.xml 移除 Neo SDK 依赖,包括 neo-java-web-api 以及可能存在的 scp-neo(groupId 为 com.sap.cloud.sdk.cloudplatform)。 第 2 步,在 dependencyManagement 中加入 CF Tomcat BOM(com.sap.cloud.sjb.cf:cf-tomcat-bom)与 SAP Cloud SDK BOM(com.sap.cloud.sdk:sdk-modules-bom),类型为 pom、scope 为 import。 第 3 步,解析并写入版本属性。不要凭记忆填写版本号,因为 SAP BOM 版本变化快,硬编码的版本会在构建时出现无法解析导入 POM 以及大量 dependencies.dependency.version is missing 错误。应每次在写入 pom.xml 前通过 Maven Central 公共搜索 API 查询最新发布版本,给出了 latest_version 函数、CF_TOMCAT_BOM_VERSION 与 SDK_MODULES_BOM_VERSION 的获取方式;若查询为空或 curl 失败,应停止并向用户报告,不得回退到训练数据中的版本号。随后将解析值写入 properties。 第 4 步,在 dependencies 中加入 scp-cf(com.sap.cloud.sdk.cloudplatform)、java-api(com.sap.cloud.security,XSUAA 集成需要)、jakarta.servlet-api(由 buildpack 提供)。 第 5 步,在添加新依赖前先扫描项目,检测已有 JSON、日志、HTTP 约定,避免引入重复库;若已存在库则复用,只有在未找到时才添加。默认情况:JSON 用 jakarta.json(JSON-P via parsson,已在 cf-tomcat-bom 中),HTTP 用 SAP Cloud SDK HttpClientAccessor,日志用 slf4j + logback。 第 6 步,按需添加额外依赖,覆盖 OpenCMIS、Mail、JSP、EL、WebSocket 等场景。 第 7 步,条件性迁移 SAPUI5 ResourceServlet:Neo 中平台提供的 com.sap.ui5.resource.ResourceServlet 在 CF 中不存在;若 HTML 通过相对路径 resources/sap-ui-core.js 引用 SAPUI5,页面会空白。需要从 web.xml 移除 ResourceServlet 声明与映射,将 HTML 改为使用当前 CDN 域名 ui5.sap.com(旧域名 sapui5.hana.ondemand.com 不再提供 1.71 以前版本),并更新已废弃主题(sap_bluecrystal、sap_belize 替换为 sap_fiori_3 或 sap_horizon)。 第 8 步,核对 servlet 映射,确保 web.xml 中每个 servlet-name 都有对应 mapping,避免 REST API 返回 404;并给出 TomEE 场景的警告。 第 9 步,替换导入语句,给出 Neo 导入与 SAP Cloud SDK 导入的对照表。 第 10 步,参考完整 pom.xml 示例模板。 第 11 步,构建打包(如固定 WAR 文件名的 maven-war-plugin 配置)由 mta-descriptor 技能负责。 第 12 步,验证运行时 classpath:若应用使用 DestinationAccessor,则需在运行时 classpath 中包含 connectivity-destination-service;检查是否已存在,若缺失不要在此添加,而由 destinations 技能负责。
配置与 CF 服务:本技能本身不需要新的配置文件,也不需要 CF 服务,服务由各功能技能定义。
验证:运行 mvn clean compile 做编译检查;用 mvn dependency:tree 查看依赖;用 grep 检查是否还有 Neo 导入未替换。
常见问题:缺少依赖版本通常因 BOM 导入未正确设置;依赖冲突可用 mvn dependency:tree 排查并添加 exclusions;运行时 NoClassDefFoundError 多与依赖 scope 有关(确认 jakarta.servlet-api 为 provided)。资料末尾关于空白页的说明被截断,暂未提供完整内容。